1. 事务定义
public interface TransactionDefinition {
// 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
int PROPAGATION_REQUIRED = 0;
// 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
int PROPAGATION_SUPPORTS = 1;
// 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常
int PROPAGATION_MANDATORY = 2;
// 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
int PROPAGATION_REQUIRES_NEW = 3;
// 总是非事务地执行,并挂起任何存在的事务
int PROPAGATION_NOT_SUPPORTED = 4;
// 总是非事务地执行,如果存在一个活动事务,则抛出异常
int PROPAGATION_NEVER = 5;
// 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作
int PROPAGATION_NESTED = 6;
// 使用后端数据库默认的隔离级别
int ISOLATION_DEFAULT = -1;
// 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;
// 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;
// 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;
// 最高的隔离级别,完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的
int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;
// 默认超时时间
int TIMEOUT_DEFAULT = -1;
// 返回事务的传播行为
int getPropagationBehavior();
// 返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。
int getIsolationLevel();
// 返回事务必须在多少秒内完成。
int getTimeout();
// 事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的(若增删改会异常)。
boolean isReadOnly();
// 返回事务的名称
@Nullable
String getName();
}
2. 事务状态
public interface TransactionStatus extends SavepointManager, Flushable {
// 是否是新的事物
boolean isNewTransaction();
// 是否有恢复点
boolean hasSavepoint();
// 设置为只回滚
void setRollbackOnly();
// 是否为只回滚
boolean isRollbackOnly();
// 通过将任何缓冲的输出写入基础流来刷新此流。
@Override
void flush();
// 是否已完成
boolean isCompleted();
}
3. 编程式事务
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 结果返回
*/
@Test
public void hasReturnTx() {
List<Map<String, Object>> result = transactionTemplate.execute(status -> {
String sql = "select id, create_time, username, amount from t_account";
return jdbcTemplate.queryForList(sql);
});
log.info("结果返回:{}", result);
}
/**
* 无结果返回
*/
@Test
public void noneReturnTx() {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
String sql = "INSERT INTO t_account (create_time, username, amount) VALUE (?, ?, ?)";
Object[] args = {LocalDateTime.now(), "xiaohei", 1000L};
int rows = jdbcTemplate.update(sql, args);
log.info("影响行数:{}", rows);
}
});
}
}
网友评论