spring事务传播之REQUIRES_NEW案例

其他传播方式都比较好模拟, 结果也正常, 未读模拟quires_new的时候发现不起作用, 并没有打倒预想的结果.
在网上看见有人说不能写在同一个类中, 于是改了下, 果然可以, 记下来
我用的是spring和jdbc

@Service
public class TransactionDefinitionTest {
    static final Logger _log = LoggerFactory.getLogger(TransactionDefinitionTest.class);

    @Autowired
    JdbcTemplate jdbcTemplate;
    @Autowired
    TransactionDefinitionTestB tdb;

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
    public void methodA(){
        jdbcTemplate.execute("UPDATE t_emoji set content = \"我是你爷爷A\" WHERE id = 55");
        _log.info(">>>>>>>>>>>>>update finish A");
        try {
            /*
            * REQUIRES_NEW在同一个对象同不能开启新的事务
            * */
            tdb.methodB();
//            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(1/0);
    }
}
@Service
class TransactionDefinitionTestB{
    static final Logger _log = LoggerFactory.getLogger(TransactionDefinitionTestB.class);
    @Autowired
    JdbcTemplate jdbcTemplate;

    @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_UNCOMMITTED)
    public void methodB(){
        jdbcTemplate.execute("UPDATE t_emoji set content = \"我是你爸爸B\" WHERE id = 54");
        _log.info(">>>>>>>>>>>>>update finish B");
            /*Map map = jdbcTemplate.queryForMap("select * from t_emoji where id = 55");
            _log.info(">>>>>>>>>>>>>>>>查询到:{}", map.toString());*/
//                System.out.println(1/0);
    }
}
数据库之前数据

methodB中的REQUIRES_NEW是创建一个新的事务, 与methodA中的事务是分离的, 所以调用methodA()后, methodB()没有异常, 成功执行提交, methodA()中抛出异常, 然后仅仅只回滚methodA()

结果与预期一致

至此完成REQUIRES_NEW的模拟


嵌套事务NESTED下只有methodA()和methodB()都没有异常的时候才能两条数据都提交, 即使methodA()中有对methodB()有 try()catch, 但外层事务还是会记录嵌套的事务状态.

你可能感兴趣的:(spring事务传播之REQUIRES_NEW案例)