是对事务状态的抽象,主要是抽象了下面两个属性
1.savepoint
2.isNewTransaction
获取TransactionStatus的方式有两种
1.静态方法TransactionAspectSupport.currentTransactionStatus()获取当前线程的TransactionStatus
2.通过PlatformTransactionManager对象的getTransaction方法获取
TransactionStatus中的savepoint
如果不了解savepoint可以点击这个链接可以复习一下savepoint
@Transactional(rollbackFor = Exception.class)
public void create() {
JdbcTemplate jdbc = new JdbcTemplate();
jdbc.setDataSource(dataSource);
jdbc.update("insert into t1(value) values ('我爱江浙和湘鄂的妹子')");
DefaultTransactionStatus transactionStatus = (DefaultTransactionStatus) TransactionAspectSupport
.currentTransactionStatus();
// 如果没有这句话,本方法将因为RuntimeException无法插入到数据库
// 但是设置了回滚点,所以回滚的时候,只能回滚到这里,表示此处回滚点
// 下面的代码都回滚,而上面的不回滚,所以数据库依然插入了'我爱武汉汉阳的妹子'
transactionStatus.createAndHoldSavepoint();
throw new RuntimeException();
}
TransactionStatus中的isNewTransaction
表示当前事务是否是一个新建的事务,是否是新的,取决于传播行为
@Component
public class Creater1 {
@Autowired
JdbcTemplate jdbcTemplate;
@Autowired
Creater2 creater2;
@Transactional(rollbackFor = Exception.class)
public void create() {
jdbcTemplate.update("insert into t1(value) values ('我爱江浙和湘鄂的妹子1')");
TransactionStatus ts = TransactionAspectSupport.currentTransactionStatus();
System.out.println("-----------------1:" + ts.isNewTransaction());
creater2.create();
}
}
@Component
public class Creater2 {
@Autowired
JdbcTemplate jdbcTemplate;
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public void create() {
jdbcTemplate.update("insert into t1(value) values ('我爱江浙和湘鄂的妹子2')");
TransactionStatus ts = TransactionAspectSupport.currentTransactionStatus();
System.out.println("-----------------2:" + ts.isNewTransaction());
}
}
@Configuration
@EnableTransactionManagement
public class TestMain {
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/swttest?serverTimezone=UTC&&useSSL=false");
ds.setUsername("root");
ds.setPassword("123456");
return ds;
}
@Bean
public JdbcTemplate jdbcTemplate() {
JdbcTemplate jdbc = new JdbcTemplate();
jdbc.setDataSource(dataSource());
return jdbc;
}
@Bean
public PlatformTransactionManager platformTransactionManager() {
DataSourceTransactionManager manager = new DataSourceTransactionManager(dataSource());
return manager;
}
public static void main(String[] args) throws Throwable {
// 依赖容器的话必须要开启@EnableTransactionManagement注解,表示告诉spring我要使用事务
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
"基础包名");
Creater1 tt = ctx.getBean(Creater1.class);
tt.create();
}
}
上述代码会打印出
-----------------1:true
-----------------2:false