数据库事务相关内容总结

知乎此文后觉得还是有必要总结下和数据库事务相关的一些知识点

四大特性

  1. 原子性
    事务中的操作要么都成功,要么都回滚
  2. 一致性
    执行事务前后的状态要一致(都是从同一个状态变到了另外的同一个状态)
  3. 隔离性
    事务A和事务B的操作互不干扰
  4. 持久性
    事务产生的结果要永久的保存在数据库

隔离级别

以下都是在有多个事务的情况下才会发生
我们假设有A、B两个事务

  1. 读未提交
    A修改了内容,但是还没有提交,B就能读到了,万一A回滚了就出问题了

    这里就产生了脏读

  2. 读提交
    A修改了内容,在没有提交前B只能看到A修改前的内容数据状态解决了脏读的问题

    这里就出现了不可重复读的问题
    比如:B先读取到id=5内容此时B事务还在继续,然后A修改了id=5的数据且提交了,此时未结束的B事务又去读id=5的数据,发现数据不一样了

  3. 可重复读
    可重复读就是为了解决上一条里面的不可重复读的问题
    解决方案是事务开始前就已经把内容先存了快照(数据版本),确保事务结束前后读取到的内容不会受其他事务的影响

    这里就会产生幻读
    A 选中了id > 3 and id < 10 的内容事务还在继续(假设此时id = 5,7,8的数据在数据库是不存在的),然后B插入了一条 id = 5 的数据提交了,A由于是读的快照里面的内容,他依然以为id=5的数据不存在,此时A又去插入id=5的数据,数据库就会报主键冲突的错,此时A再次查询id > 3 and id < 10 ,却还是依然没看到id=5的数据

  4. 串行化
    A事务处理完了才能处理B事务

    解决了幻读,因为不存在并发了,但也降低了性能

  1. 共享锁(读锁)
    对于同一条数据,多个读操作可以同时进行

  2. 排他锁(写锁)
    对于一条数据,只能有一个写(删、改)的操作
    存在读锁时不能写,存在写锁时不能读

  3. 行锁
    锁的粒度小,加锁慢,锁冲突几率小,并发度高

  4. 表锁
    锁的粒度大,加锁快,冲突几率大,并发读低

  5. 间隙锁
    此文介绍比较详细

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

事物还是事务?

1个月前 评论
Iwanna (楼主) 1个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!