标签:调用 epo 允许 update 自己 ref mic sre blog
事务特性: (ACID)
如果不考虑隔离性会出现如下问题:
事务的隔离级别:
关于事务的详细内容可以查阅:【DataBase】事务
分层开发:事务处在Service层.
PlatformTransactionManager:平台事务管理器,定义了如下方法:
Public interface PlatformTransactionManager()...{
// Return a currently active transaction or create a new one, according to the specified propagation behavior(根据指定的传播行为,返回当前活动的事务或创建一个新事务。)
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
// Commit the given transaction, with regard to its status(使用事务目前的状态提交事务)
Void commit(TransactionStatus status) throws TransactionException;
// Perform a rollback of the given transaction(对执行的事务进行回滚)
Void rollback(TransactionStatus status) throws TransactionException;
}
TransactionDefinition:事务定义信息
TransactionStatus:事务的状态
Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现 :
org.springframework.jdbc.datasource.DataSourceTransactionManager
:使用Spring JDBC或iBatis 进行持久化数据时使用org.springframework.orm.hibernate3.HibernateTransactionManager
:使用Hibernate3.0版本进行持久化数据时使用org.springframework.orm.jpa.JpaTransactionManager
:使用JPA进行持久化时使用org.springframework.jdo.JdoTransactionManager
:当持久化机制是Jdo时使用org.springframework.transaction.jta.JtaTransactionManager
:使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用如果我们在使用JDBC或者Mybatis进行数据持久化操作时,我们的XML配置通常如下:
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
事务管理器接口 PlatformTransactionManager 通过 getTransaction(TransactionDefinition definition)
方法来得到一个事务,这个方法里面的参数是 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 = Connection.TRANSACTION_READ_UNCOMMITTED;
int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;
int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;
int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;
int TIMEOUT_DEFAULT = -1;
//方法
int getPropagationBehavior();
int getIsolationLevel();
int getTimeout();
boolean isReadOnly();
String getName();
}
TransactionDefinition 接口中定义了五个表示隔离级别的常量:
ISOLATION_DEFAULT:默认的隔离级别. MySQL:repeatable_read
,Oracle: read_commited
ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
事务的传播行为:不是JDBC事务管理,是用来解决实际开发的问题,解决业务层之间的调用的事务的关系.
?
支持当前事务
不支持当前事务
其他(Spring 所特有的)
所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。
事务的只读属性是指,对事务性资源进行只读操作或者是读写操作。所谓事务性资源就是指那些被事务管理的资源,比如数据源、 JMS 资源,以及自定义的事务性资源等等。如果确定只对事务性资源进行只读操作,那么我们可以将事务标志为只读的,以提高事务处理的性能。在 TransactionDefinition 中以 boolean 类型来表示该事务是否只读。
这些规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚(这一行为与EJB的回滚行为是一致的)。但是你可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。
TransactionStatus接口用来记录事务的状态 该接口定义了一组方法,用来获取或判断事务的相应状态信息.
PlatformTransactionManager.getTransaction(…)
方法返回一个TransactionStatus
对象。返回的TransactionStatus
对象可能代表一个新的或已经存在的事务(如果在当前调用堆栈有一个符合条件的事务)。TransactionStatus
接口接口内容如下:
public interface TransactionStatus{
boolean isNewTransaction(); // 是否是新的事物
boolean hasSavepoint(); // 是否有恢复点
void setRollbackOnly(); // 设置为只回滚
boolean isRollbackOnly(); // 是否为只回滚
boolean isCompleted; // 是否已完成
}
声明式事务、编程式事务
以后再整理
标签:调用 epo 允许 update 自己 ref mic sre blog
原文地址:https://www.cnblogs.com/haoworld/p/spring-shi-wu.html