2018.04.16
丢失修改。
排他锁(eXclusive Lock),X 锁。用于写数据。commit 后才释放。
脏数据。
进程读到未提交的内容。
一个程序读后,另一个程序提交前再次修改,则读的是脏数据。
共享锁(Share Lock),S 锁。用于读取数据。
多个进程可同时获取 S 锁。
一个数据加了 X 锁就无法加 S 锁,反之亦然。
读数据时,S 锁需要一直锁定,直到事务提交。否则释放锁后,再次读数据可能不一致。
幻读:一个事务内两次查询中数据条数不一致。
查询到符合某条件的数据项,X 锁锁定这些数据项,另一个程序插入新的数据项恰好符合条件,持 X 锁的程序再次查询时,数据项增多。
数据库事务的隔离级别
-
read uncommitted:一个程序 read 时,另一个持 X 锁的程序尚未 commit 。没有 S 锁。解决了丢失修改。
-
read committed:用 S 锁与 X 锁不能同时加来保证。解决了脏数据。
-
repeatable read:用 S 锁 commit 后才释放来保证。解决了重复读。
-
serializable:事务操作必须顺序执行。解决了幻读。
MVCC
多版本并发控制
在读的时候不用加锁,也能实现可重复读。
有两种事务 ID,一是进程的事务 ID,二是一条记录的事务 ID。
有一个叫 Read View 的数据结构,它由三部分组成:
一:活跃的进程事务 ID 列表。
二:活跃的进程事务 ID 最小值 Tmin。
三:最大进程事务 ID 最大值加一 Tmax。
每条记录有两个额外的字段 tid、回滚指针。
一个进程对某条记录修改后,tid 更新到当前进程,回滚指针指向记录的上一个版本。
http://mp.weixin.qq.com/s/cbaR--hlEN37fwTIRNhKaQ
http://mp.weixin.qq.com/s/EjVfk1iOuQUjLfPxt_DJ7Q
http://mp.weixin.qq.com/mp/homepage?__biz=MzAxOTc0NzExNg==&hid=4&sn=568693fc15f6e3693deaf11fcf489abc&scene=18#wechat_redirect
网友评论