各位大大,
mybatisplus樂觀鎖插件原理:攔截sql并添加version相關:update set version+1 where version=oldversion
以此根據影響行數可以判斷樂觀鎖例外是否發生。
現在,在事務內,即使db內資料version已經被修改,當前update基于session內已讀取的資料,影響行數仍然為1。事務內如何拋出樂觀鎖例外呢?
uj5u.com熱心網友回復:
大佬們別潛水uj5u.com熱心網友回復:
沒太明白你的問題,你的事務隔離級別是啥?uj5u.com熱心網友回復:
隔離級別mysql默認可重復讀uj5u.com熱心網友回復:
事務A1.select xxx from table where id=1;
查詢結果:entity:version=100
2.其它事務修改了id=1,version變為101;
3.當前事務A內
upfateOtherEntity();//其它表更新成功
entity.setxxx=“xxx”;
int i=mapper.updateById(entity);//因其它事務修改了,verdion100已不存在
實際sql:update table set xxx=xxx,version=101 where id=1 and version=100;
if(i <1) throw new OptimisticException(“樂觀鎖例外,期望事務回滾,但是i總是=1,此例外拋不出去”);
//實際:事務提交成功,otherentity修改成功,entity修改失敗,不符合期望
uj5u.com熱心網友回復:
無事務時i==0,沒問題。有事務時i==1(事務內,基于可重復讀,version=100還可讀,還存在,i==1沒毛病,提交時才知道影響行數為0),那么事務內如何拋出OptimisticException呢uj5u.com熱心網友回復:
當版本號被1事務改變了,如果此事務沒提交,另2事務來修改是會阻塞的,當1事務提交了,那2事務是在1事務修改后的值進行操作的,這時候2事務肯定是修改不成功,修改條數是0,不可能出現修改條數為1,然后2事務提交的時候才告訴你修改不成功的。你這個出現修改成功的,肯定是代碼的問題
uj5u.com熱心網友回復:
用事務為啥還要用樂觀鎖呢?或者說用樂觀鎖為啥還要用事務呢?樂觀鎖的特點就是非阻塞鎖,你在事務內用樂觀鎖,肯定不會出現版本號沖突的問題啊,騷年uj5u.com熱心網友回復:
親 你確定用樂觀鎖就不用事務嗎?
a提交了,b樂觀鎖例外了,怎么回滾a?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/26051.html
標籤:Java相關
上一篇:Visual Studio
下一篇:請教兩種泛型方法有什么不同。
