溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mybatis中update語句執(zhí)行無效怎么解決

發(fā)布時間:2021-11-26 14:46:20 來源:億速云 閱讀:1001 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“mybatis中update語句執(zhí)行無效怎么解決”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“mybatis中update語句執(zhí)行無效怎么解決”吧!

項目里mybatis有時update語句執(zhí)行無效

公司測試人員在測試的時候發(fā)現(xiàn),在積分系統(tǒng),消費產(chǎn)生了積分,有時候,卻不能加到用戶累計積分上去。

明明積分流水記錄跟用戶積分的增加在一個事務當中的。積分流水記錄生成成功,偏偏用戶積分沒有加上去?奇了怪了。

加積分的代碼是:

tMemberPointMapper.updateByPrimaryKeySelective(tMemberPoint);

然后在相應的位置,加了日志,記錄更新語句前后的對比。

測試人員再次發(fā)現(xiàn)問題時查看了日志,日志顯示更新語句執(zhí)行后的對象確實是有累加過積分的。為什么數(shù)據(jù)庫表中的值就是沒變呢?

于是百度啊,這種情況百度的結(jié)果比較少,有的說是mybatis的版本的問題?個人感覺不太可能,因為這個mybatis版本在很多項目是使用,都沒出過問題。事務也是測試過,有異常能夠回滾。

后來冷靜下來想了想出現(xiàn)問題的時機。測試人員在消費操作過后,會立刻點查看用戶積分的界面。這時會調(diào)獲取用戶積分信息的接口。因為這個接口,不僅僅是查詢,因為等級維持機制(過一定的周期,要扣掉一部分積分), 它在查詢前,對用戶積分有修改的操作。所在,查詢用戶積分的接口,也處在非只讀的事務中。

當兩個對同條用戶積分記錄操作的事務同時執(zhí)務(InnoDb的行級鎖,排它鎖),由于,mysql的默認隔離級別是repeatable-read,事務A和事務B,讀到數(shù)據(jù)為a,后事務B修改了數(shù)據(jù)為b,提交了,而事務A再執(zhí)行修改操作,又會把數(shù)據(jù)b修改為數(shù)據(jù)a。這就出現(xiàn)了,題中所述的,偶爾出現(xiàn)update語句執(zhí)行無效的假象。

解決辦法

悲觀鎖 在查詢語句后加 for update ,鎖住事務中,查詢用戶積分的語句。

 <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.ice.pojo.f3.TMemberPointExample" >
    select
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from t_member_point
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
    for update
  </select>

執(zhí)行update語句后,數(shù)據(jù)沒有被更新,也沒有報錯

記錄一下今天遇到的一個問題:

問題描述

執(zhí)行update語句后,數(shù)據(jù)沒有被更新,也沒有報錯

詳細情況

通過傳參的方式,在控制臺打印出的sql語句;將sql語句拷貝到數(shù)據(jù)庫執(zhí)行也是OK

解決辦法

百思不得其解,到底問題出在了那里?

所以,試了很多方法,最后才發(fā)現(xiàn)某一個字段的問題;但是從控制臺打印的sql語句來看,參數(shù)值也是OK的?。?/p>

然后我嘗試將mapper中sql語句的參數(shù)寫成控制臺打印出來的參數(shù),直接確定下來,運行,發(fā)現(xiàn)也是OK的,那么確定是這個參數(shù)問題了;

但是映射啥的都沒問題,所以問題就有可能在數(shù)據(jù)庫存的這個字段的長度問題了,最后發(fā)現(xiàn)數(shù)據(jù)庫該字段的長度長于傳的參數(shù)的值,而且在實體類中使用trim()對屬性值做了處理,所以問題就在這里,修改一下就好了。

感謝各位的閱讀,以上就是“mybatis中update語句執(zhí)行無效怎么解決”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對mybatis中update語句執(zhí)行無效怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI