关于脏读那部分内容
来源:3-14 锁模块之事务并发访问产生的问题以及事务隔离机制
慕UI3469488
2019-05-09
像老师说的,开启read committed;session1开启事务,对存款做了1100-100 的操作,session2也开启事务,查询存款,得到结果是存款值为1100,那么此时如果session1不进行回滚,而是commit,那么session2对查到的存款1100做跟新操作,如1100+200,此时数据是不是依然会出现问题?本该1200,结果变为1300,如果是问题,这个问题又被叫做什么?要怎么解决?
写回答
1回答
-
如果直接在程序中计算得到结果,再更新回数据库,那么就会出现上述问题,这个问题不属于数据库的问题,应该由程序进行控制,或者将数据的变化直接通过sql反馈到数据库里,比如说
update xxx set balance = balance - 100 update xxx set balance = balance + 200
这样就能依照数据库的隔离机制避免相关的问题。
在程序里面的话,如果非要去取出1100 然后 做加法变成 1300再更新回数据库的话,为了避免这样的结果,方法很多,其中一个可以采取程序乐观锁,做版本控制,比如说将最终的sql转成 update xxx set balance = 1300 where balance = 1100; 这样即可避免,因为咱们这时balance已经不是1100了,所以update会失败,你在程序里用while循环来控制,不断尝试,失败后,就重新读取balance 再做操作 。
112019-05-10
相似问题