Spring下面的@Transactional注解的讲解

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("运行时异常被捕获,事务不回滚");
    }     
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容