数据库的四大隔离性
- 读未提交
- 读已提交
- 可重复读
- 串行化
这里主要介绍读已提交
、读已提交含义就是、不会产生脏读、但是会产生可重复读、例子如下、通过下图解释可得知读已提交
是避免不了可重复数据滴、原因:线程6在同一事务下、两次查询不一致、如果线程6中第一次查询后包含业务逻辑、那么在这种情况下、就会引发一定的业务问题
说一下锁的问题、很明显上面第二次查询被阻塞、那么阻塞特的肯定是锁、update
和delete
都会产生锁、特别是在事务中、如果该事务不提交、那么就会阻塞接下来的相关执行语句、可以参考如下update
阻塞问题
线程5
和6
基本同时执行、然后俩线程执行查询、这时候无任何锁、然而当5
对数据进行了修改、这个时候6
再次进行修改的时候、因为5
的事务还未提交、6
就产生了阻塞、一直等到线程5
事务提交后、线程6
的修改语句才执行完毕
我这里用的是SqlServer
经过一遍遍测试发现我修改A
数据后未提交事务、如果这个时候我在另外事务中修改B
的时候会被阻塞、但是如果是查询B
则不会被阻塞、数据库锁
也分为很多种、具体锁的机制可以参考一下Mysql锁机制 分析的相当全面
以我的理解来说、事务隔离性主要会对读造成影响、主要有脏读
不可重复读
幻读
、但是也可能会带来更新丢失
、参考投票业务
、如果你是先查询、程序累加票数、再修改、那么无论该业务需不需要加事务、当并发一定大的时候都会带来更新丢失
问题、这个可以参考一下乐观锁
的实现方式
在针对某些业务编写代码时、不单单要考虑事务隔离性
还要考虑所使用数据库的锁机制
只有全面的分析后才能得到最优的解决方案