使用Hibernate、Spring和MySQL时,谨慎选择MySQL的表类型

Hibernate采用的是write-behind的策略。MySQL的MyISAM类型,是不支持事务的,InnoDB类型支持事务。

现在有如下方法,假设表类型为MyIASM。
@Transaction
public void someMethod(User user) {
    user.setAge(28);
    update(user);
    flush();
    xxxDao.updateCategory(user.getCategory());

    throw new RuntimeException();
}

 

现在,执行这个方法,会发生什么事情呢?可以发现,用户被更新了,但是,xxxDao执行的更新被回滚了。

天哪,太可怕了!是这样的,flush()会导致Hibernate将session中的内容同步到数据库,但是此时还是可以回滚的,前提是数据库支持事务。否则就一定会被同步到数据库,但是下面那条语句,因为抛出了异常,实际上session内缓存的内容是没有同步到数据库的。

 

将表类型修改为InnoDB后,问题解决,可以正确回滚。所以,平常写程序的过程中,尤为注意,要慎用flush(),且一定要谨慎选择MySQL的表类型,重要数据的表,一定要采用InnoDB类型,确保事务可以正确执行。

 

另外,不仅是flush()会立即将session的内容同步到数据库,自增主键的表,当执行insert的时候,也一样会立即写入数据,因为持久化对象必须拥有一个主键,加入您采用了MyIASM,且这个方法有事务,后面还抛出了异常的话。那个之前的保存是不会再回滚了,已经写入到数据库了。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值