数据库的事务隔离

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

你可能感兴趣的:(数据库的事务隔离)