MySQL事务与锁
MySQL两大数据库引擎:
MyISAM 支持 表锁
InnoDB 支持 行锁,表锁
数据库事务:
事务并发产生的三大问题:
一个事务执行前后两次读取另一个事务修改未提交或回滚的数据,产生脏读;
一个事物执行前后两次读取另一个事务修改或删除已提交的数据,产生不可重复读;
一个事物执行前后两次读取另一个事务增加已提交的数据,造成两次读取数据不一致,产生幻读;
事务并发产生的另一个问题: lost update丢失更新 并不是数据库层面可以解决的,在代码层解决;
事务四种隔离级别:
事务隔离级别 脏读 不可重复读 幻读
未提交读(Read Uncommitted) 可能 可能 可能
已提交度(Read Committed) 不可能 可能 可能
可重复读(Repeatable Read) 不可能 不可能 对InnoDB不可能
串行化(Serializable) 不可能 不可能 不可能
锁的粒度:
表锁与行锁的区别:
锁定粒度:
行锁:共享锁(Share Locks)
共享锁:又称读锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都可以访问到数据,但是只能读不能修改数据;
加锁、释所方式:
select * from student where id=1 LOCK IN SHARE MODE;
commit/rollback;
行锁:排它锁(Exclusive Locks)
排它锁:又称写锁,简称X锁,排它锁不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能获取改数据行的锁(共享锁、排它锁),只有该获 取了排它锁的事务是可以对数据进行读取和修改的。
加锁、释锁的方法:
自动:delete / update / insert 默认加上X锁;
手动: select * from student where id=1 FOR UPDATE;
commit / rollback; //一个事务结束会释放锁
表锁:意向共享锁(IS)/ 意向排它锁(IX)
意向锁是有由数据引擎自己维护的,用户无法手动操作意向锁;
意向共享锁(Intention Shared Lock,简称IS锁)
表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁;
意向排它锁(Intention Exclusive Lock ,简称IX锁)
表示事务准备给数据行加入排它锁,说明事务在以嘎数据行加排它锁前必须先取得该表的IX锁;
思考:为什么需要(标记别的)意向锁?
表锁相当于一个标志,我们对于一张表加上表锁的前提是:没有其他事物已经锁定了这一张表的任意一行。这个标志可以提高行锁加锁效率。
所的作用:解决资源竞争问题,解决并发问题
锁到底锁住了什么?
是一行数据(Row/Record)吗?
是一个字段(Column)吗?
答案:锁住了索引。
Record Lock : 记录锁
唯一性索引(唯一/主键)等值查询,精准匹配。
select * from student whrer id=2 for update;
锁住 id=4
Gap Lock : 间隙锁
条件:记录不存在
注意:Gap锁之间不冲突,Gap Lock 只在RR(可重复读)事务个理解别存在。
select * from student where id>4 and id <7 for update;
select * from student where id=6 for update;
锁住:(4,7)
Next-Key Lock : 临键锁
条件:既包含记录,又包含区间
Next-Key Lock = Gap Lock + Record Lock
select * from student where id>5 and id<9 for update;

锁住:(4,7] (7,10]
InnoDB引擎默认可重复读事务隔离级别,因为RR事务加入了间隙锁,在查询时锁住查询范围内的间隙,使其他事务不能够插入数据,从而避免幻读。
索引:
什么是索引?
索引的底层数据结构是什么?
主键索引和辅助索引?
不同的索引存储数据的方式不一样。

浙公网安备 33010602011771号