原创分享 数据库事务相关内容总结

wanna · 2020年09月20日 · 157 次阅读

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

四大特性

  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. 间隙锁 此文介绍比较详细

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册