不考虑隔离性的情况下事务并发执行时读取的数据可能不准确,
分为三种情况(脏读,不可重复读,幻读)
1)脏读:
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
例:
事务A修改num=123
------事务B读取num=123(A操作还未提交时)
事务A回滚
此时就会出现B事务读到的num并不是数据库中真正的num的值,这种情况就叫“脏读”。
2)不可重读:
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
例:
事务A读取num=123(事务A并未结束)
------事务B修改num=321,并提交了事务
事务A再次读取num=321
此时就会出现同一次事务A中两次读取num的值不一样,这种情况就叫“不可重读”。
3)虚读/幻读:
是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
例:
事务A查询或修改表中所有num=123的数据(事务A并未结束)
------事务B新增一条num=123的数据,并提交事务
事务A再次查询num=123的数据
此时就会出现两次查询到的数据条数不一致,或者存在还有数据没有被修改到,这种情况就叫“虚读/幻读”。
总结
脏读就是读到错误的数据
解决:读取时加读锁(共享锁),读取完释放;写时加写锁(排它锁),事务提交释放。(读已提交)
不可重复读就是相同条件下多次查询得到的数据值不一致
解决:读加读锁,写加写锁,都是事务提交后释放。(可重复读)
幻读就是相同条件下多次查询得到的记录数不一致
解决:读加读锁,写加写锁,采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读,这样就避免了幻影读问题。 (串行化)