Mysql事务与锁详解
事务
事务并发的三大问题
事务的四种隔离级别
Read Uncommitted(未提交读) --未解决任何并发问题
事务未提交的数据对其他事务也是可见的,会出现幻读
Read Committed(已提交读) --解决脏读问题
一个事务开始之后,只能看到已提交的事务所做的修改,会出现不可重复读
Repeatable Read(可重复读) --解决不可重复读问题
在同一个事务中多次读取同样的数据结果是一样的,这种隔离级别未定义解决幻读的问题
Serializable(串行化) --解决所有问题
最高的隔离级别,通过强制事务的串行执行
事务隔离级别的实现
解决方案:
锁的基本类型
锁的粒度
锁:用于管理不同事务对共享资源的并发访问
表锁与行锁的区别:
锁定粒度:表锁 > 行锁
加锁效率:表锁 > 行锁
冲突概率:表锁 > 行锁
并发性能:表锁 < 行锁
Mysql InnDB锁类型
共享锁(行锁):Shared Locks
又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改;
加锁释锁方式:
select * from user where id = 1 LOCK IN SHARE MODE;
commit/rollback;
排它锁(行锁):Exclusive Locks
又称为写锁,简称X锁,排他锁不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的锁(共享锁、排他锁),只有该获取了排他锁的事务是可以对数据行进行读取和修改。
加锁释锁方式:
自动:delete/update/insert 默认加上X锁
手动:select * from user where id = 1 FOR UPDATE;
commit/rollback;
意向共享锁(表锁):Intention Shared Locks / 意向排它锁(表锁):Intention Exclusive Locks
意向共享锁:表示事务准备给数据行加入共享锁,也就说一个一个数据行加共享锁前必须先取得该表的IS锁。
意向排它锁:表示事务准备给数据行加入排它锁,说明事务在一个数据行加排它锁前必须先取得该表的IX锁。
意向锁是由数据引擎自己维护的,用户无法手动操作意向锁。
行锁算法
记录锁 Record Locks
间隙锁 Gap Locks
临键锁 Next-key Locks
锁的原理:到底锁住了什么?
行锁的算法:锁住了什么范围?