文章目录
PlatformTransactionManager接口
此接口是spring提供的平台事务管理器,主要用于事务管理。
该接口提供了3个事务操作的方法
返回类型 | 方法 | 作用 |
---|---|---|
TransactionStatus | getTransaction ( TransactionDefinition definition ) | 获取事务状态 |
void | commit ( TransactionDefinition definition ) | 提交事务 |
void | rollback( TransactionDefinition definition ) | 回滚事务 |
注:方法1返回一个TransactionStatus类型的对象(一个事务),它被关联在当前执行的线程上
PlatformTransactionManager 接口有许多不同的实现类,常见的几个实现类如下
- org .springframework.jdbc.datasource.DataSourceTransactionManager: 用于配置 JDBC
据源的事务管理器。 - org .springframework.orm. hibernate4. HibernateTransactionManager :用于配 Hibernate
的事务管理器 - org .springframework. transaction .jta.Jta TransactionManager: 用于配置全局事务管
理器
TransactionDefinìtion接口
TransactionDefinition接口是事务定义(描述)的对象,该对象中定义了事务规则,并提供了获取事务相关信息的方法,具体如下
返回类型 | 方法 | 作用 |
---|---|---|
String | getName() | 获取事务对象名称 |
int | getlsolationLevel() | 获取事务的隔离级别 |
int | getPropagationBehavior() | 获取事务的传播行为 |
int | getTimeout() | 获取事务的超时时间 |
boolean | isReadOnly() | 获取事务是否可读 |
TransactionStatus接口
TransactionStatus 接口是事务的状态,它描述了某一时间点上事务的状态信息。该接口中包含 6个方法,具体如下
返回类型 | 方法 | 作用 |
---|---|---|
void | flush() | 刷新事务 |
boolean | hasSavepoint() | 获取是否存在保存点 |
boolean | isCompleted() | 获取事务是否完成 |
boolean | isNewTransaction() | 获取是否是新事务 |
boolean | isRollbackOnly() | 获取事务是否回滚 |
void | setRollbackOnly() | 设置事务回滚 |
事务管理的方式
编程式事务管理
声明式事务管理
声明式事务是建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,它的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等
本节参考于:https://www.cnblogs.com/nnngu/p/8627662.html
基于xml的声明式事务例子
需要spring-tx.4.3.6.RELEASE和spring-aop.4.3.6.RELEASE包
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 数据库驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<!-- 连接字符串 -->
<property name="url" value="jdbc:mysql://localhost:3306/emis" />
<!-- 数据库用户名和密码 -->
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<!-- 配置jdbc模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- ref引用上面的数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 定义id为crud的bean -->
<bean id="crud" class="com.Crud" >
<!-- 将jdbcTemplate注入到jdbcTemplate对象中 -->
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<!-- 声明事务管理器,依赖于数据源 -->
<bean
id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 基于xml的声明式事务 -->
<tx:advice id="txAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<!-- *表示任意方法 -->
<tx:method name="*"
propagation="REQUIRED"
isolation="DEFAULT"
read-only="false" />
</tx:attributes>
</tx:advice>
<!-- 声明式事务是建立在aop上的 -->
<!--编写aop,自动对目标生成代理 ,aspectj框架-->
<aop:config>
<!-- execution(* com.*.*(..))"-->
<!-- 第一个*的位置 表示返回类型 *代表所有返回类型-->
<!-- 第二个*的位置 表示类-->
<!-- 第三个*的位置 表示方法-->
<!-- (..)表示方法的参数 ..代表任意参数-->
<aop:pointcut expression="execution(* com.*.*(..))"
id="txPointCut" />
<!-- 切面 将切入点与通知整合 -->
<aop:advisor advice-ref="txAdvice"
pointcut-ref="txPointCut" />
</aop:config>
</beans>
CrudDao接口
package com;
import java.util.List;
public interface CrudDao {
public void transfer(String out,String in, double money);
}
CrudDao接口的实现类
public class Crud implements CrudDao{
public void transfer(String out,String in, double money){
jdbcTemplate.update("update account set money=money-? where username=?",money,out);
//
jdbcTemplate.update("update account set money=money+? where username=?",money,in);
}
}
基于注解的声明式事务例子
只需要在执行事务的方法上添加如下注解
//基于注解的声明式事务,这三个属性是tx:method里的属性
@Transactional(propagation = Propagation.REQUIRED ,
isolation = Isolation.DEFAULT , readOnly = false)