Spring 事务不回滚的解决办法

Spring 事务不回滚的问题关键是:不能对该异常用try...catch处理,否则不会回滚事务!

 

还有几种可能:

  1. 表不支持支持事务,mysql下必须为InnoDB
  2. mysql为绿色版的缘故,改装正式版试试
  3. 待补充。。

 

@Service("systemConfigService")
public class SystemConfigServiceImpl extends AbstractGenericService 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("运行时出错!"); 
			}
		}
	}
}

你可能感兴趣的:(JAVA)