数据库事务相关内容总结
读知乎此文后觉得还是有必要总结下和数据库事务相关的一些知识点
四大特性#
- 原子性
事务中的操作要么都成功,要么都回滚 - 一致性
执行事务前后的状态要一致(都是从同一个状态变到了另外的同一个状态) - 隔离性
事务 A 和事务 B 的操作互不干扰 - 持久性
事务产生的结果要永久的保存在数据库
隔离级别#
以下都是在有多个事务的情况下才会发生
我们假设有 A、B 两个事务
读未提交
A 修改了内容,但是还没有提交,B 就能读到了,万一 A 回滚了就出问题了这里就产生了脏读
读提交
A 修改了内容,在没有提交前 B 只能看到 A 修改前的内容数据状态解决了脏读的问题这里就出现了不可重复读的问题
比如:B 先读取到 id=5 内容此时 B 事务还在继续,然后 A 修改了 id=5 的数据且提交了,此时未结束的 B 事务又去读 id=5 的数据,发现数据不一样了可重复读
可重复读就是为了解决上一条里面的不可重复读的问题
解决方案是事务开始前就已经把内容先存了快照 (数据版本),确保事务结束前后读取到的内容不会受其他事务的影响这里就会产生幻读
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 的数据串行化
A 事务处理完了才能处理 B 事务解决了幻读,因为不存在并发了,但也降低了性能
锁#
共享锁 (读锁)
对于同一条数据,多个读操作可以同时进行排他锁 (写锁)
对于一条数据,只能有一个写(删、改)的操作
存在读锁时不能写,存在写锁时不能读行锁
锁的粒度小,加锁慢,锁冲突几率小,并发度高表锁
锁的粒度大,加锁快,冲突几率大,并发读低间隙锁
此文介绍比较详细
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: