事务详解
spring,中处理事务主要是由三个接口完成(对于不同持久层可能有各自的实现方式。)
org.springframework.transaction.PlatformTransactionManager;
org.springframework.transaction.TransactionDefinition;
org.springframework.transaction.TransactionStatus;
PlatformTransactionManager.java
public interface PlatformTransactionManager {
/**
* 根据指定的传播行为,返回当前活动的事务或创建一个新的事务。
* 注意,像隔离级别或超时这样的参数只适用于新的事务,
* 因此在参与活动的事务时将被忽略。此外,并不是所有事务定义
* 设置都将得到每个事务管理器的支持:当遇到不受支持的设置时,
* 适当的事务管理器实现应该抛出异常。上述规则的一个例外是只
* 读标志,如果不支持显式的只读模式,则应该忽略它。从本质上说,
* 只读标志只是一个潜在优化的提示。
*
* @param definition
* @return
* @throws TransactionException
*/
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
/**
* 提交事务
*
* @param status
* @throws TransactionException
*/
void commit(TransactionStatus status) throws TransactionException;
/**
* 回滚事务
*
* @param status
* @throws TransactionException
*/
void rollback(TransactionStatus status) throws TransactionException;
}
TransactionDefinition .java
隔离级别及其说明:
TransactionDefinition.ISOLATION_DEFAULT
PlatformTransactionManager的默认隔离级别(对大多数数据库来说就是ISOLATION_> READ_COMMITTED)
最低的隔离级别。事实上我们不应该称其为隔离级别,因为在事务完成前,其他事务可以看到该事务所修改的数据。而在其他事务提交前,该事务也可以看到其他事务所做的修改TransactionDefinition.ISOLATION_READ_COMMITTED
大多数数据库的默认级别。在事务完成前,其他事务无法看到该事务所修改的数据。遗憾的是,在该事务提交后,你就可以查看其他事务插入或更新的数据。这意味着在事务的不同点上,如果其他事务修改了数据,你就会看到不同的数据TransactionDefinition.ISOLATION_REPEATABLE_READ
比ISOLATION_READ_COMMITTED更严格,该隔离级别确保如果在事务中查询了某个数据集,你至少还能再次查询到相同的数据集,即使其他事务修改了所查询的数据。然而如果其他事务插入了新数据,你就可以查询到该新插入的数据TransactionDefinition. ISOLATION_SERIALIZABLE
代价最大、可靠性最高的隔离级别,所有的事务都是按顺序一个接一个地执行
传播行为及其说明
TransactionDefinition.PROPAGATION_REQUIRED
当前如果有事务,Spring就会使用该事务;否则会开始一个新事务TransactionDefinition.PROPAGATION_SUPPORTS
当前如果有事务,Spring就会使用该事务;否则不会开始一个新事务TransactionDefinition.PROPAGATION_MANDATORY
当前如果有事务,Spring就会使用该事务;否则会抛出异常TransactionDefinition.PROPAGATION_REQUIRES_NEW
Spring总是开始一个新事务。如果当前有事务,则该事务挂起TransactionDefinition.PROPAGATION_NOT_SUPPORTED
Spring不会执行事务中的代码。代码总是在非事务环境下执行,如果当前有事务,则该事务挂起TransactionDefinition. PROPAGATION_NEVER
即使当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则抛出异常TransactionDefinition. PROPAGATION_NESTED
如果当前有事务,则在嵌套事务中执行。如果没有,那么执行情况与Transaction- Definition.PROPAGATION_REQUIRED一样
public interface TransactionDefinition {
//....还有许多属性
int getPropagationBehavior(); // 返回事务的传播行为
int getIsolationLevel(); // 返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据
int getTimeout(); // 返回事务必须在多少秒内完成
boolean isReadOnly(); // 事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的
}
TransactionStatus.java
public interface TransactionStatus{
boolean isNewTransaction(); // 是否是新的事物
boolean hasSavepoint(); // 是否有恢复点
void setRollbackOnly(); // 设置为只回滚
boolean isRollbackOnly(); // 是否为只回滚
boolean isCompleted; // 是否已完成
}