Mybatis-Plus updateBatchById() 更新无效

本文介绍一种 updateBatchById() 更新无效的场景。

updateBatchById() 更新无效,日志显示更新操作已下发,但是数据库中的数据没有变化。

==>  Preparing: UPDATE device SET sync_time=? WHERE id=? 
==> Parameters: 2005-01-20 14:13:40.261(Timestamp), 1(Long)
==> Parameters: 2020-12-04 09:46:34.134(Timestamp), 1333657436765392897(Long)
==> Parameters: 2005-01-20 14:13:42.359(Timestamp), 1334334748443824129(Long)
==> Parameters: 2020-12-04 09:43:28.0(Timestamp), 1334385804280360962(Long)

第一次遇到这种情况,很是莫明其妙,在网上找,大多都是介绍 null 值不能更新的情况,跟我这不一样。特此记录。

最后,定位出是 @Transactional 注解的问题。当方法前有该注解时,如果方法中出现未处理的异常,就会执行回滚。此时,在方法中,updateBatchById() 不会立刻更新数据库,而是等方法执行完,且没有触发回滚,才会去更新数据库。如果触发了回滚,也就不会更新数据库了。

@Transactional 注解是spring中常用注解之一。如果我们想让方法在发生未处理的异常时进行回滚,就在方法前加上这个注解。

使用 @Transactional 注解的一些注意点:

  • 在需要事务管理的地方加@Transactional 注解。@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的public 方法上。

 

  • @Transactional 注解只能应用到 public 可见度的方法上。如果你在 protected、private 或者package-visible 的方法上使用@Transactional 注解,它也不会报错,但是这个被注解的方法将不会展示已配置的事务设置。

 

  • Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。在接口上使用@Transactional 注解,只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。

 

  • @Transactional 的事务开启 ,或者是基于接口的或者是基于类的代理被创建。所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的。

 

@Transactional 注解介绍部分引用自:

https://blog.csdn.net/qq_41517071/article/details/96282332

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值