您的位置:首页 > 编程语言 > Java开发

spring 编程式事务管理

2016-11-04 14:49 295 查看
说道事务我们先来说下事务的概念(概念是百度百科的,大家对概念不懂的可以去查一下):

事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,mysql能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。

事务的4个特性

A:原子性(Atomicity)

事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。

B:一致性(Consistency)

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

C:隔离性(Isolation)

一个事务的执行不能被其他事务干扰。

D:持续性/永久性(Durability)

一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

我们接下来仔细说说用编程式事务管理:

编程式事务管理一般有两种实现方式

1.通过spring的底层 API 的来实现

2.通过spring的TransactionTemplate 类来实现

先来说PlatformTransactionManager接口实现方式

通过底层 API 来实现事务管理,需要了解3个核心类PlatformTransactionManager、TransactionDefinition 和 TransactionStatus。

transactiondefinition

它包括了事务的静态属性,例如:事务流转举动、事务执行超时时间,隔离级别等等。Spring 为我们供应了一个默许的完成类:DefaultTransactionDefinition,该类适用于除夜多半情形。假定该类不能知足需求,可以经由进 程完成 TransactionDefinition 接口来完成本人的事务界说。

PlatformTransactionManager用于执行具体的事务操作。commit方法用于提交事务,rollback方法用于回滚事务,源码如下:

Public interface PlatformTransactionManager{
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; //得到一个事务
void commit(TransactionStatus status)throws TransactionException;  //提交事务
void rollback(TransactionStatus status)throws TransactionException; //回滚事务
}


TransactionStatus可以让PlatformTransactionManager控制事务的执行,可以检查事务是不是一个新事物,或者只是只读,TransactionStatus还可以初始化回滚操作。

spring底层API实现事务管理代码示例:

@Service
public class MainServiceImpl implements MainService{

@Autowired
private MainMap mainMap;

@Autowired
private MainMap;
@Autowired
private PlatformTransactionManager  txManager;

private
public List<User> getUserInfo() {
List<User> result=null;
DefaultTransactionDefinition      transactionDefinition=newDefaultTransactionDefinition()
TransactionStatus  transactionStatus=transactionManager.getTransaction(transactionDefinition);
try {
result=mainMap.getUserInfo();
txManager.commit(transactionStatus);
} catch (Exception e) {
txManager.rollback(transactionStatus)
e.printStackTrace();
}
return  result;
`
需要在spring的配置文件配置事务管理
<bean id="transactionManager"`  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>


再来说说基于TransactionTemplate的编程式事务管理

因为上面的事务管理方法需要在service层嵌入事务提交与回滚的代码,如果需要使用事务的方法过多,那么需要不断的重复嵌入事务提交与回滚的代码很是麻烦。这里TransactionTemplate就简洁多了

首先在spring的配置文件下配置:

<bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<!--ISOLATION_DEFAULT 表示由使用的数据库决定  -->
<property name="isolationLevelName" value="ISOLATION_DEFAULT"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
<property name="timeout" value="30"/>
</bean>

public boolean getUserInfo() {
return (Boolean) transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus status) {
List<User> result;
try {
result = mainMap.getUserInfo();
} catch (Exception e) {
status.setRollbackOnly();
result = false;
System.out.println("Transfer Error!");
}
return result;
}

4000
});
}


TransactionTemplate 的 execute() 方法有一个 TransactionCallback 类型的参数,该接口中有一个 doInTransaction() 方法,通常我们以匿名内部类的形式完成 TransactionCallback 接口,并在其 doInTransaction() 方法中书写业务逻辑代码。这里可以行使默许的事务提交和回滚事务,这样在业业代码中就不需求显示使用任何事务治理的 API。doInTransaction() 方法有一个TransactionStatus 类型的参数,我们可以在方法的任何位置使用该参数的 setRollbackOnly() 方法将事务标识为回滚的,以实行事务回滚。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 编程 事务 java