数据库事务相关内容总结
读知乎此文后觉得还是有必要总结下和数据库事务相关的一些知识点
四大特性
- 原子性
事务中的操作要么都成功,要么都回滚 - 一致性
执行事务前后的状态要一致(都是从同一个状态变到了另外的同一个状态) - 隔离性
事务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 协议》,转载必须注明作者和本文链接
事物还是事务?