事务隔离级别
下图为一般情况下的隔离级别及可能出现的现象,mysql默认事务隔离级别为REPEATABLE READ。
但,解决了幻读现象(gap lock)
读时
-
在普通select情况下
不加锁,而是采用快照(以当前时间点创建)的方式,保证当前事务下以后每次读到的数据都是该时间点之前提交的(可重复读)。除非当前事务自己修改了数据才会看到,因此可能出现幻写现象(修改到了看不到的数据),但是再次查询时会看到已修改的数据,并且在事务提交之前其它事务不能再次修改(修改时会加排它锁)。 -
可以手动为select加锁:
for update(排它锁),lock in share mode(共享锁),这时使用的是next key lock,这种锁是record lock和gap lock的结合体,在事务结束时释放锁。2.1 在使用for update的情况下,其它事务无法同时读取也无法修改或删除。
record lock:如果查询条件为特定记录,则排它锁定返回的记录(无索引时锁定整个表),导致其它事务无法读取也无法修改删除这些记录。gap lock:如果查询条件为范围查询,则排它锁定该范围,导致其它事务无法读取也无法修改删除这些记录,也无法在该范围内插入数据(无索引时锁定整个表),因此不会出现幻读现象。2.2 在使用
lock in share mode情况下,其它事务只能读取,因此也是可重复读的。record lock:如果查询条件为特定记录,则共享锁定返回的记录(无索引时锁定整个表),导致其它事务只能读取却无法修改删除这些记录。gap lock:如果查询条件为范围查询,则共享锁定该范围,导致其它事务只能读取却无法修改删除这些记录,也无法在该范围内插入数据(无索引时锁定整个表),因此不会出现幻读现象。
写时
在update delete insert时,和for update是一样的效果,使用的也是排它锁记录或范围。