Spring 事务管理 1 ——3个接口 介绍

回顾 事务  课程 Spring事务管理

在Spring事务管理中  Spring提供了 3个 接口 来进行事务管理。 

1. 接口 PlatformTransactionManager 平台事务管理器:真正用来管理事务的接口,包含 事务的提交,回滚等信息

Spring 为不同的持久层框架 提供了 不同的实现类。然后根据不同的持久层框架 去选择不同的 平台事务管理器实现类。

如果持久层框架使用jdbc,就选择实现类DataSourceTransactionManager。 如果持久层使用Hibernate,就选择实现类HibernateTransactionManager。

package org.springframework.transaction;

public interface PlatformTransactionManager {

	TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
	void commit(TransactionStatus status) throws TransactionException;
	void rollback(TransactionStatus status) throws TransactionException;

}

2. 接口 TransactionDefinition:事务的定义信息:包含事务操作的 隔离级别,传播行为,是否超时 ,是否是只读的等信息。

package org.springframework.transaction;

import java.sql.Connection;

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();

}

2.1 事务的隔离级别:设置 事务的隔离级别。 参考事务

2.2 事务的传播性事务的传播行为 就是 来解决 业务层方法 之间 相互调用过程中 产生的 事务应该如何传递的问题

在实际开发中,我们是将服务器端分为三层:web层 ;业务层 ;持久层。事务 需要加在 业务层 (Service层)

假设在持久层 有如下两个类和方法 : DAO1{aaa();}  DAO2{bbb();}

public class DAO1 {
	public  void xxx();
}

public class DAO2 {
	public void yyy();
}

在业务层 有如下操作: Service1{xxx(){ DAO1.aaa(); DAO2.bbb();}}  Service2{yyy(){ }}   

@Transactional
public class Service2 {
	public void aaa() {
		DAO1.xxx();
		DAO2.yyy();
	}
}
@Transactional
public class Service2 {

	public void bbb();
}

如果 在业务层 出现复杂情况: 需要调用 两个业务层方法 才能实现。  这两个业务层方法 都有事务。那到底使用哪个事务呢。 例如:某个业务层方法 需要调用 servcie1.xxx()方法  和 service2.yyy()方法 。而且Service1 和Service2都有事务。那在这个方法中 到底使用 哪个事务呢。 

public class Controller1 {
	public Controller1() {
		Service1.aaa();
		Service2.bbb();
	}
}

7种传播行为 可以分为 3类 

第一类:aaa()和bbb()在同一事务中。常用PROPAGATION_REQUIRED  。如果aaa有事务,就使用aaa的事务,如果aaa 没有事务,这3种处理是不一样的。

 PROPAGATION_REQUIRED  :支持当前事务 ,如果不存在,就创建一个。如果aaa() 有事务,bbb()就用aaa()的事务。如果aaa() 没有事务,bbb()就创建事务 并且把aaa()包含进来。
 PROPAGATION_SUPPORTS  :支持当前事务,如果不存在,就不使用事务。如果aaa() 有事务,bbb()就用aaa()的事务。如果aaa() 没有事务,bbb()就不使用事务。
 PROPAGATION_MANDATORY :支持当前事务,如果不存在,就抛出异常。如果aaa() 有事务,bbb()就用aaa()的事务。如果aaa() 没有事务,就抛出异常。 

第二类:aaa和bbb没有在一个事务中。常用 PROPAGATION_REQUIRES_NEW PROPAGATION_REQUIRES_NEW  :如果有事务存在,挂起当前事务,创建一个新的事务。如果aaa中有事务,就把当前aaa中的事务挂起,自己再创建一个新的事务。。
 PROPAGATION_NOT_SUPPORTED  :以非事务方式运行,如果有事务存在,挂起当前事务。如果aaa中有事务,就把当前aaa中的事务挂起,来执行。
 PROPAGATION_NEVER  :以非事务方式运行,如果有事务存在,则抛出异常。如果aaa中有事务,就会抛出异常

 第三类:嵌套事务 :用到保存点。
 PROPAGATION_NESTED  :如果当前事务存在,就会使用嵌套事务。如果aaa有事务,就会事务来设置一个保存点。再去执行bbb的时候,如果bbb() 方法没有异常,则aaa()和bbb()一起提交。如果bbb()方法发生了异常,那么可以根据自己的设置,把事务回滚到 保存点或者回滚到最初始状态。

2.3 定义事务超时时间

2.4 定时事务是否只读

3. 接口 TransactionStatus 事务的具体运行状态:该接口提供的方法可以获取或者判断事务的相关状态。事务是否有保存点,事务是否已经完成,事务是不是一个新的事务等等这些状态。

package org.springframework.transaction;

import java.io.Flushable;
 
public interface TransactionStatus extends SavepointManager, Flushable {
 
	boolean isNewTransaction(); 
	boolean hasSavepoint(); 
	void setRollbackOnly(); 
	boolean isRollbackOnly(); 
	@Override
	void flush(); 
	boolean isCompleted();

}

 

4. 这3个接口之间的联系:spring 在进行事务管理时,根据事务的定义信息,由平台事务管理器 真正进行事务管理。在事务管理过程中,事务产生了相应状态,这些状态就保存在了事务运行状态中。

posted on 2020-03-12 20:42  dreamstar  阅读(328)  评论(0编辑  收藏  举报