美文网首页我爱编程
数据库的事务隔离

数据库的事务隔离

作者: 一块大番薯 | 来源:发表于2018-06-21 22:13 被阅读10次

    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

    相关文章

      网友评论

        本文标题:数据库的事务隔离

        本文链接:https://www.haomeiwen.com/subject/fiuekftx.html