论坛首页 Java企业应用论坛

Spring 事务不回滚的解决办法

浏览 12447 次
精华帖 (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("运行时出错!"); 
			}
		}
	}
}
 
   发表时间:2012-02-12  
Spring 默认是捕捉到unchecked异常,如RuntimeException才回滚事务的。
楼主用的是xml配置的事务吧,也可以使用@Transactional来使用,更灵活的说

0 请登录后投票
   发表时间:2012-02-13  
不尽然,有些exception你即使抛出也不会回滚!transaction有一个属性叫rollbackfor就是配置遇到那些异常就rollback,如没有设置值则为runtimeexception或者error
0 请登录后投票
   发表时间:2012-02-14  
建议LZ看下Spring的PlatformTransactionManager源代码
0 请登录后投票
   发表时间:2012-02-14  
你异常捕捉到了,不抛出去,spring怎么会知道你异常了????
0 请登录后投票
   发表时间:2012-02-14  
try catch还是要的,记录日志嘛。
0 请登录后投票
   发表时间:2012-02-14  
不是简单try catch的问题,你可以好好看下spring的事务管理机制。当你用托管事务时,事务拦截器会调用你的实际方法,当捕捉到异常时,根据事务配置决定是否回滚。
0 请登录后投票
   发表时间: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标准。

但事务回滚可以通过配置来改变缺省行为。
0 请登录后投票
   发表时间:2012-02-15  
根据事务配置决定是否回滚。
0 请登录后投票
   发表时间:2012-02-15  
可以try---catch后做一些自己的处理,然后再throw
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics