项目中,mybatis 有时 update 语句执行无效的解决

公司测试人员在测试的时候发现,在积分系统,消费产生了积分,有时候,却不能加到用户累计积分上去。

明明积分流水记录跟用户积分的增加在一个事务当中的。积分流水记录生成成功,偏偏用户积分没有加上去?奇了怪了。加积分的代码是:tMemberPointMapper.updateByPrimaryKeySelective(tMemberPoint);

然后在相应的位置,加了日志,记录更新语句前后的对比。

测试人员再次发现问题时查看了日志,日志显示更新语句执行后的对象确实是有累加过积分的。为什么数据库表中的值就是没变呢?

于是百度啊,这种情况百度的结果比较少,有的说是mybatis的版本的问题?个人感觉不太可能,因为这个mybatis版本在很多项目是使用,都没出过问题。事务也是测试过,有异常能够回滚。

后来冷静下来想了想出现问题的时机。测试人员在消费操作过后,会立刻点查看用户积分的界面。这时会调获取用户积分信息的接口。因为这个接口,不仅仅是查询,因为等级维持机制(过一定的周期,要扣掉一部分积分), 它在查询前,对用户积分有修改的操作。所在,查询用户积分的接口,也处在非只读的事务中。

当两个对同条用户积分记录操作的事务同时执务(InnoDb的行级锁,排它锁),由于,mysql的默认隔离级别是repeatable-read,事务A和事务B,读到数据为a,后事务B修改了数据为b,提交了,而事务A再执行修改操作,又会把数据b修改为数据a。这就出现了,题中所述的,偶尔出现update语句执行无效的假象。

解决办法:悲观锁 在查询语句后加 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>

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!对于 MyBatis 的 foreach,如果遇到文乱码问题,可以尝试以下几种解决方案: 1. 确保数据库连接的字符集设置正确。在数据库连接配置文件,确保设置了正确的字符集,比如使用 UTF-8。 2. 在 MyBatis 的配置文件添加如下内容,以告知 MyBatis 使用 UTF-8 编码处理字符串: ```xml <configuration> <settings> <setting name="jdbcTypeForNull" value="NULL" /> <setting name="mapUnderscoreToCamelCase" value="true" /> <setting name="localCacheScope" value="SESSION" /> <!-- 添加以下配置 --> <setting name="defaultStatementTimeout" value="3000" /> <setting name="defaultExecutorType" value="SIMPLE" /> <setting name="defaultFetchSize" value="100" /> <setting name="autoMappingBehavior" value="PARTIAL" /> <setting name="jdbcTypeForNull" value="OTHER" /> <setting name="callSettersOnNulls" value="false" /> <setting name="lazyLoadingEnabled" value="true" /> <setting name="aggressiveLazyLoading" value="true" /> <setting name="multipleResultSetsEnabled" value="true" /> <!-- 添加的配置结束 --> </settings> </configuration> ``` 3. 在 MyBatis 的 SQL 映射 XML 文件,确保正确指定了字符集。例如,在 `<select>`、`<update>`、`<insert>` 等语句,添加 `characterEncoding=utf8` 属性。 4. 如果以上方法仍然无效,可以尝试在 JDBC 连接地址添加 `useUnicode=true&characterEncoding=utf8` 参数,例如: ``` jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf8 ``` 这些方法的一种或多种应该能够解决 MyBatis foreach 文乱码问题。希望对您有所帮助!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值