锁定老帖子 主题:Spring 事务不回滚的解决办法
精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-12
Spring 事务不回滚的问题关键是:不能对该异常用try...catch处理,否则不会回滚事务!
@Service("systemConfigService") public class SystemConfigServiceImpl extends AbstractGenericService<SystemConfig> implements SystemConfigService { @Resource(name="systemConfigDAO") private SystemConfigDAO systemConfigDAO; @Override public void deleteByIds(String id) { if(id != null){ String[] ids = id.split(","); try { SystemConfig systemConfig = systemConfigDAO.get(2); systemConfig.setValue("测试值"); systemConfigDAO.update(systemConfig); // 执行如下操作,数据库将报唯一索引重复问题 // Caused by: java.sql.BatchUpdateException: Duplicate entry 'PORTAL.CITYCODE' for key 'name' SystemConfig systemConfig2 = systemConfigDAO.get(2); systemConfig2.setName("PORTAL.CITYCODE"); systemConfigDAO.update(systemConfig2); } catch (Exception e) { log.error(e); // 如果注释掉throw new RuntimeException,那么事务将不能回滚,因为spring捕捉不到Exception // 解决办法,去掉try catch,或者在cache中抛出异常以便spring捕获 throw new RuntimeException("运行时出错!"); } } } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-02-12
Spring 默认是捕捉到unchecked异常,如RuntimeException才回滚事务的。
楼主用的是xml配置的事务吧,也可以使用@Transactional来使用,更灵活的说 |
|
返回顶楼 | |
发表时间:2012-02-13
不尽然,有些exception你即使抛出也不会回滚!transaction有一个属性叫rollbackfor就是配置遇到那些异常就rollback,如没有设置值则为runtimeexception或者error
|
|
返回顶楼 | |
发表时间:2012-02-14
建议LZ看下Spring的PlatformTransactionManager源代码
|
|
返回顶楼 | |
发表时间:2012-02-14
你异常捕捉到了,不抛出去,spring怎么会知道你异常了????
|
|
返回顶楼 | |
发表时间:2012-02-14
try catch还是要的,记录日志嘛。
|
|
返回顶楼 | |
发表时间:2012-02-14
不是简单try catch的问题,你可以好好看下spring的事务管理机制。当你用托管事务时,事务拦截器会调用你的实际方法,当捕捉到异常时,根据事务配置决定是否回滚。
|
|
返回顶楼 | |
发表时间:2012-02-14
最后修改:2012-02-14
缺省情况下,即事务配置中没有异常回滚配置,就是unchecked exception和checked exception的区别。spring捕获unchecked exception时(NullPointer,HibernateException, etc,继承自RuntimeException),rollback;捕获checked exception时(IOException, SQLException, etc),仍然commit。这种设计是参照EJB标准。
但事务回滚可以通过配置来改变缺省行为。 |
|
返回顶楼 | |
发表时间:2012-02-15
根据事务配置决定是否回滚。
|
|
返回顶楼 | |
发表时间:2012-02-15
可以try---catch后做一些自己的处理,然后再throw
|
|
返回顶楼 | |