关于脏读那部分内容

来源:3-14 锁模块之事务并发访问产生的问题以及事务隔离机制

慕UI3469488

2019-05-09

像老师说的,开启read committed;session1开启事务,对存款做了1100-100 的操作,session2也开启事务,查询存款,得到结果是存款值为1100,那么此时如果session1不进行回滚,而是commit,那么session2对查到的存款1100做跟新操作,如1100+200,此时数据是不是依然会出现问题?本该1200,结果变为1300,如果是问题,这个问题又被叫做什么?要怎么解决?

写回答

1回答

翔仔

2019-05-10

如果直接在程序中计算得到结果,再更新回数据库,那么就会出现上述问题,这个问题不属于数据库的问题,应该由程序进行控制,或者将数据的变化直接通过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 再做操作 。

1
1
慕UI3469488
明白了 谢谢老师
2019-05-10
共1条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程