Atomic:原子性,事务必须是一个原子的工作单元,要么全部成功,要么全部失败
Consistent:一致性,事务完成时必须使所有的数据保持一致状态
Isolation:隔离性,并发事务所做的修改必须与其他事务所做的修改是隔离的
Duration:持久性,事务完成后对系统的影响是永久性的
站在事物管理角度,可分为以下两种:
全局事物(分布式事物)JTA
本地事物
不用事物的编程框架来管理事物,直接使用资源管理器来控制事物。典型的就是java.sql.Connection中的setAutoCommit、commit、rollback方法
本地事物有以下几种优点:支持严格的ACID属性
可靠
高效
状态可以只在资源管理器中维护
应用编程模型简单
不具备分布式事物处理能力(不能跨多个事物资源工作)
本地事物对编程模型具有侵入性
本地事物的局限性
声明式事物的实现(AOP)
@Transactional
xml配置切面
编程式事物
使用TransactionTemplate或TransactionalOperator
直接实现TransactionManager

通常在少量事物操作的情况下,编程式事物管理通常是一个好注意。如果存在大量的事物操作声明式事物是一个更好的选择
传播性(Propagation)
| Propagation | Description |
| REQUIRED | 支持当前事务,假设当前没有事务。就新建一个事务 |
| REQUIRES_NEW | 新建事务,假设当前存在事务。把当前事务挂起 |
| SUPPORTS | 支持当前事务,假设当前没有事务,就以非事务方式运行 |
| NOT_SUPPORTED | 以非事务方式运行操作。假设当前存在事务,就把当前事务挂起 |
| MANDATORY | 支持当前事务,假设当前没有事务,就抛出异常 |
| NEVER | 以非事务方式运行,假设当前存在事务,则抛出异常 |
| NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务, 则进行与PROPAGATION_REQUIRED类似的操作;有个savepoint,外层事物会把嵌套事物一起回滚,而嵌套事物回滚不会影响外层事物 |
隔离性(Isolation)
| Isolation | Description |
| DEFAULT | DEFAULT 这是一个PlatformTransactionManager默认的隔离级别, 使用数据库默认的事务隔离级别 |
| READ_UNCOMMITED | 未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生 |
| READ_COMMITED | 已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生 |
| REPEATABLE_READ | 可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生 |
| SERIALIZABLE | 串行化的 (serializable) :避免以上所有读问题 |
超时(Timeout)
设置事物执行超时时间
public static void DateSourceUtils#applyTimeout(...) {
Statement#setQueryTimeout(timeout);
}
只读(Read-only status)
TransactionStatus接口为事务代码提供了一种简单的方法来控制事务执行和查询事务状态,TransactionStatus接口清单:
public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {
@Override
boolean isNewTransaction();
boolean hasSavepoint();
@Override
void setRollbackOnly();
@Override
boolean isRollbackOnly();
void flush();
@Override
boolean isCompleted();
}
TransactionManager事物管理器主要分为:
PlatformTransactionManager
ReactiveTransactionManager
/**
* 具体事物管理器实现,如JPA、JDBC、Hibernate、JMS等
*/
public interface PlatformTransactionManager extends TransactionManager {
/**
* 获取事物状态
*/
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
/**
* 提交
*/
void commit(TransactionStatus status) throws TransactionException;
/**
* 回滚
*/
void rollback(TransactionStatus status) throws TransactionException;
}




