天天看点

Spring-tx-PlatformTransactionManager(DataSourceTransactionManager)

事务管理接口,负责事务的创建,提交,回滚,三个操作

//创建事务,返回该事务的状态
  TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;

  //提交事务,具体提交哪个事务,由参数status决定
  void commit(TransactionStatus status) throws TransactionException;
  //事务回滚,滚到哪里,由参数status决定,也可以理解由
  //TransactionStatus中的savepoint属性决定
  void rollback(TransactionStatus status) throws TransactionException;      

PlatformTransactionManager接口最重要的实现类是DataSourceTransactionManager,下面的事例使用该实现类演示事务的提交

@Autowired
DataSourceTransactionManager tx

public void aa(){
  DefaultTransactionDefinition def=new DefaultTransactionDefinition();
  //这个地方可以根据自己需要选择传播行为和隔离级别
  def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
  TransactionStatus status=tx.getTransaction(def);
  try{
  自己的各种业务操作
  tx.commit();//然后这里提交
  }catch(Exception e){
  tx.rollback(status);//报错这里回滚
  }
}      
public static void main(String[] args) throws SQLException {
  HikariDataSource ds = new HikariDataSource();
  ds.setJdbcUrl("jdbc:mysql://localhost:3306/swttest?serverTimezone=UTC&&useSSL=false");
  ds.setUsername("root");
  ds.setPassword("123456");
  PlatformTransactionManager manager = new DataSourceTransactionManager(ds);
  DefaultTransactionAttribute td = new DefaultTransactionAttribute();
  TransactionStatus status = manager.getTransaction(td);

  Map<Object, Object> resourceMap = TransactionSynchronizationManager.getResourceMap();
  ConnectionHolder connectionHolder = (ConnectionHolder) resourceMap.get(ds);
  Connection conn = connectionHolder.getConnection();
  conn.prepareStatement("insert into t1(value) values ('二抱三抱是真抗冻')").execute();
  manager.commit(status);
  // manager.rollback(status);
}