数据库并发事务存在的四个问题(更新丢失、脏读、不可重复读、幻读)
如果不考虑事务隔离性,可能会发生以下情况
更新丢失:当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题一一最后的更新渡盖了由其他事务所做的更新。(这就引发了并发并发线程安全问题,可以加了版本号,用cas乐观锁处理)
例如,两个程序员修改同一java文件,每程序员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文档。最后保存其更改副本的编辑人员覆盖前一个程序员所做的更改
脏读:事务a,读到了事务b未提交的数据,如果事务a读到了事务b的一些中间数据,待处理的数据。b事务数据还没有提交,就被a事务访问了,针对update操作
(解决方法:将 读未提交 级别提高到 读已提交 例如:orale在事务a 更新t表的时候,表t为锁住的状态,事务a未提交之前,事务b就不能访问t表)
不可重复读:指的是事务两次读取数据不一样。因为中间被其他事务修改了。解决方法就是 将 级别提高到 可重复。使用行级锁,锁定当前记录,其它事务无法更改。
幻读:一个事务在查询,另一个事务在做插入或者删除,此时就会出现幻读。导致表的总行数不一致的情况,针对insert或delete操作
事务的干扰级别:读未提交、读已提交、可重复读、串行化。
隔离级别越高,性能越低
参考博客:
https://blog.csdn.net/fanzhigang0/article/details/93198059