Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked
如果遇到checked意外就不回滚。
如何改变默认规则:
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
实例1:事务的回滚情况
默认情况对非运行时异常不进行回滚操作
/**
* 运行时异常默认事务回滚
* @throws Exception
*/
@Transactional
public void updateUser_1() throws Exception {
Map<String,String> userMap=new HashMap<String,String>();
userMap.put("id","1");
userMap.put("userName","测试_01");
userMap.put("password","654321");
userDao.updateUserByID(userMap);
throw new RuntimeException(); //抛出运行时异常 默认情况下回滚 事务---------------------->回滚
}
2非运行时异常默认事务不回滚
/**
* 非运行时异常默认事务不回滚
* @throws Exception
*/
@Transactional
public void updateUser_3() throws Exception {
Map<String,String> userMap=new HashMap<String,String>();
userMap.put("id","1");
userMap.put("userName","测试_01");
userMap.put("password","654321");
userDao.updateUserByID(userMap);
throw new Exception(); //抛出非运行时异常 默认情况下不回滚 事务---------------------->不回滚
}
3对所有异常事务都进行回滚操作
/**
* 对所有异常事务都进行回滚操作
* @throws Exception
*/
@Transactional(rollbackFor=Exception.class)
public void updateUser_6() throws Exception {
Map<String,String> userMap=new HashMap<String,String>();
userMap.put("id","1");
userMap.put("userName","测试_01");
userMap.put("password","654321");
userDao.updateUserByID(userMap);
throw new Exception(); //对所有异常事务都进行回滚操作 事务---------------------->回滚
}
4对所有异常事务都不进行回滚操作
/**
* 对所有异常事务都不进行回滚操作
* @throws Exception
*/
@Transactional(noRollbackFor=Exception.class)
public void updateUser_7() throws Exception {
Map<String,String> userMap=new HashMap<String,String>();
userMap.put("id","1");
userMap.put("userName","测试_01");
userMap.put("password","654321");
userDao.updateUserByID(userMap);
throw new RuntimeException(); //对所有异常,事务都不进行回滚操作 事务---------------------->不回滚
}
5对try{} catch{}的异常不回滚
/**
* 对于try{} catch{}的异常不进行回滚
* @throws Exception
*/
@Transactional
public void updateUser_5() throws Exception {
Map<String,String> userMap=new HashMap<String,String>();
userMap.put("id","1");
userMap.put("userName","测试_01");
userMap.put("password","654321");
userDao.updateUserByID(userMap);
try{
throw new RuntimeException(); //运行时异常被捕获,事务不回滚
}
catch(Exception e){
System.err.println("运行时异常被捕获,事务不回滚");
}
}