其他传播方式都比较好模拟, 结果也正常, 未读模拟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<String, Object> 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, 但外层事务还是会记录嵌套的事务状态.