全局事务和本地事务
1、全局事务
基本的支持分布式事务;
在业内,主要用来解决分布式事务的方案是使用柔性事务。柔性事务包括几种类型:两阶段型、补偿型、异步确保型和最大努力通知型。
事务管理器控制着全局事务,管理事务生命周期,并协调资源。资源管理器负责控制和管理实际资源。在全局事务中,为了保证所有的操作可以一次性要么全提交,要么全失败。事务管理器和资源管理器之间的事务操作的控制是采用2PC(两阶段提交)来进行的。
2、本地事务
JDBC事务
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
声明式事务和编程式事务
1 public interface PlatformTransactionManager { 2 3 TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; 4 5 void commit(TransactionStatus status) throws TransactionException; 6 7 void rollback(TransactionStatus status) throws TransactionException; 8 }
1、TransactionDefinition的说明
- 隔离级别
对应数据库中的隔离级别:http://www.cnblogs.com/bigshark/p/7912184.html
ISOLATION_DEFAULT |
使用数据库的隔离级别 |
ISOLATION_READ_UNCOMMITTED |
未提交读 |
ISOLATION_READ_COMMITTED |
提交读 |
ISOLATION_REPEATABLE_READ |
可重复读-Mysql默认级别 |
ISOLATION_SERIALIZABLE |
可串行化 |
- 传播行为
PROPAGATION_REQUIRED |
方法必须运行在事务中,如果当前事务存在,方法会在当前事务运行,否则启动一个新事务。 |
PROPAGATION_SUPPORTS |
方法不需要事务上下文,但是如果存在当前事务,则会在这个事务中运行。 |
PROPAGATION_MANDATORY |
方法必须运行在事务中,如果当前事务不存在,则抛出异常。 |
PROPAGATION_REQUIRES_NEW |
方法必须运行在它自己的事务中,如果存在当前事务,事务将被挂起。 |
PROPAGATION_NOT_SUPPORTED |
方法不应该运行在事务中,如果存在当前事务,事务将被挂起。 |
PROPAGATION_NEVER |
方法不应该运行在事务上下文中,如果当前有事务在运行,则抛出异常。 |
PROPAGATION_NESTED |
如果当前已经存在一个事物,方法会在嵌套事务中运行,嵌套事务可以独立提交或回滚;如果不存在事务,其行为和PROPAGATION_REQUIRED一样。 |
- 超时设置setTimeout(int timeout),默认-1
- 是否只读setReadOnly(boolean readOnly),默认false,事务告知对数据库只进行读操作,数据库可以利用事务的只读特性进行一些优化。
- 回滚规则execute(TransactionCallback<T> action)。
2、TransactionStatus提供所有事务API通用的,用来控制事务执行和事务状态查询的简单方法
1 public interface TransactionStatus extends SavepointManager { 2 3 boolean isNewTransaction(); 4 5 boolean hasSavepoint(); 6 7 void setRollbackOnly(); 8 9 boolean isRollbackOnly(); 10 11 void flush(); 12 13 boolean isCompleted(); 14 15 }
3、PlatformTransactionManager的使用需要应用DataSource数据源,DataSourceTransactionManager支持JDBC和MyBatis场景。
1 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 2 <property name="dataSource" ref="dataSource"/> 3 </bean>
Spring的声明式事务是通过Spring AOP实现的。
调用事务代理的方法的过程:
Spring提供两种编程式事务的方法:TransactionTemplate、PlatformTransactionManager
资料
《Spring In Action》