spring 事务传播行为之嵌套事务NESTED细节
照抄自:https://www.jianshu.com/p/c6d4095f5833
spring 事务传播行为之嵌套事务NESTED细节
经过我之前的实践,可以看出 NESTED事务申明在调用者上会新建一个独立事务。申明在被调用者上,若调用者存在事务则加入调用者事务。调用者不存在事务则新建一个独立事务。
这个功能好像和spring默认的事务传播行为REQUIRED一样的?
不,它的功能可是比REQUIRED要强大!
我来通过实验证明NESTED和REQUIRED的区别
这个例子是基于 https://www.jianshu.com/p/bc3cbacf9e70 这个文章的代码
首先,InsertUsers和InsertCuser方法上都申明了REQUIRED,让他们属于同一个事务。将引发异常的语句
int i = 1/0;
放到 InsertCuser方法里
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void InsertUsers(Users users) {
jdbcTemplate.update("INSERT INTO users(id,name, age, email) VALUES (?, ?, ?, ?);", users.getId(), users.getName(), users.getAge(), users.getEmail());
//调用service中另一个方法
Cuser cuser = new Cuser(users.getId(), users.getName(), users.getAge(), users.getEmail());
//打印事务名
List<Map<String, Object>> maps = jdbcTemplate.queryForList("SELECT TRX_ID FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID( );");
System.out.println(maps + TransactionSynchronizationManager.getCurrentTransactionName());
//对InsertCuser抛出的异常进行捕获处理,并且不再向上抛出
try {
cuserService.InsertCuser(cuser);
} catch (Exception e) {
e.printStackTrace();
}
}