spring事务机制
0.优点
- 提供统一的API接口支持不同的资源
- 提供声明式事务管理
- 方便与spring框架集成
- 多个资源的事务管理、同步
1.事务抽象
-
PlatformTransactionManager(事务管理器)
public interface PlatformTransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;
void commit(TransactionStatus var1) throws TransactionException;
void rollback(TransactionStatus var1) throws TransactionException;
}
-
TransactionDefinition(事务定义,包括事务隔离级别,事务传播机制)
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;
int PROPAGATION_NESTED = 6;
int ISOLATION_DEFAULT = -1;
int ISOLATION_READ_UNCOMMITTED = 1;
int ISOLATION_READ_COMMITTED = 2;
int ISOLATION_REPEATABLE_READ = 4;
int ISOLATION_SERIALIZABLE = 8;
int TIMEOUT_DEFAULT = -1;
int getPropagationBehavior();
int getIsolationLevel();
int getTimeout();
boolean isReadOnly();
@Nullable
String getName();
}
-
TransactionStatus(事务的运行状态)
public interface TransactionStatus extends SavepointManager, Flushable {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
void flush();
boolean isCompleted();
}
2.事务隔离机制
- TransactionDefinition.ISOLATION_DEFAULT 使用数据库的隔离级别
- TransactionDefinition.ISOLATION_READ_UNCOMMITTED 读未提交,解决数据丢失,但会引起脏读
- TransactionDefinition.ISOLATION_READ_UNCOMMITTED 读已提交,解决脏读,但不可重复读
- TransactionDefinition.ISOLATION_REPEATABLE_READ 可重复读,解决不可重复读,但存在幻读
- TransactionDefinition.ISOLATION_SERIALIZABLE 串行化
3.事务的传播机制
传播机制指的是:当一个事务方法A调用另一个事务方法B时,必须指定事务应该如何传播。(?到底在哪里指定,另一个方法又是如何承接)
事务传播机制一共有7个。
传播行为 | 定义 |
TransactionDefinition.PROPAGATION_REQUIRED | 表示当前方法必须运行在事务中。如果A方法有事务即当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务 |
TransactionDefinition.PROPAGATION_SUPPORTS | 表示支持事务,如果有当前事务,则继承;无事务,则无 |
TransactionDefinition.PROPAGATION_MANDATORY | 表示当前方法必须运行在事务中,如果有当前事务,则继承;无事务,则抛出异常 |
TransactionDefinition.PROPAGATION_REQUIRED_NEW | 如果存在当前事务,在该方法执行期间,当前事务会被挂起,会开启一个新的事务。因为数据库事务不支持嵌套,所以该级别一般只在JTA实现 |
TransactionDefinition.PROPAGATION_NOT_SUPPORTED | 表示当前方法不在事务中执行,如果有当前事务存在,则把当前事务挂起 |
TransactionDefinition.PROPAGATION_NERVER | 表示当前绝不在事务中执行,如果当前事务存在,则抛出异常 |
TransactionDefinition.PROPAGATION_NESTED | 表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。只能在JDBC3.0以上才能实现,通过savepoint来实现 |
required_new和nested的区别:
required_new是独立的两个事务,B事务回滚提交与A事务无关,则A回滚了但B可以提交。
嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。