事务控制实现方式有:
- 编程式事务控制:自己手动创建对象,编写事务控制代码
- 基于XML的声明式事务控制:通过配置文件完成
- 基于注解的声明式事务控制:通过注解完成
编程式
spring提供的事务管理器接口PlatformTransactionManager
,不同的DAO层技术有不同的实现类(如 jdbc/mybatis/hibernate),该接口的方法有:
- 获取事务的状态信息(
getTransactionStatus(TransactionDefinition)
) - 提交事务(
commit(status)
) - 回滚事务(
rollback(status)
)
编程式事务控制的三大对象:
- PlatformTransactionManager平台事务管理接口:不同平台实现了不一样的类
- TransactionDefinition事务定义
- 方法包括:设置事务级别、设置事务传播行为
- TransactionStatus事务运行状态
- 方法包括:是否存储回滚点、事务是否完成、是否是新事物、事务是否回滚
事务控制理解:Spring框架事务控制管理是基于AOP实现的
- 业务可以看做切点(被增强方法),事务可以看做通知(增强方法)
- 配置切面:xml或者注解
基于XML
- 导入坐标spring-context aspectjweaver spring-jdbc spring-tx spring-test druid
- 创建数据表account(name, money)
- 创建domain模板
- 创建dao层,实现和数据库的简单交互 (in 转出钱, out 转入钱)
- 创建service层,实现业务逻辑 (transfer一个账转到另一个账号,该方法算是一个事务)
- 创建测试方法,调用service方法
- 配置xml,重要内容如下:
- 定义一个事务管理(配置事务管理器)
- 配置通知(配置事务),里面指定切点(service业务逻辑)
- 织入:将切点和通知结合
<!--平台事务管理器,从dataSource中获取一个conn-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--通知:增强方法,也就是事务-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--事务定义-->
<tx:attributes>
<!--切点1:transfer方法-->
<tx:method name="transfer"/>
<!--切点2:查询方法-->
<tx:method name="findAll"/>
<!--切点3:更新方法,可以使用通配符-->
<tx:method name="update*"/>
</tx:attributes>
</tx:advice>
<!--事务织入-->
<aop:config>
<!--事务织入就用advisor,其他织入可以用aspect-->
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.service.impl.*.*(..))"/>
</aop:config>
在配置切点时,有几个参数可以配置
<tx:method name="xx">
1. name: 切点方法名称
2. isolation: 事务隔离级别
3. propogation: 事务传播行为
4. timeout: 超时时间
5. read-only: 是否只读
基于注解
配置文件如下:
- 组件扫描
- 事务管理器
- 事务的注解驱动
<!--组件扫描-->
<context:component-scan base-package="com"/>
<!--平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--事务的注解驱动:让事务注解起作用-->
<tx:annotation-driven transaction-manager="transactionManager"/>
注解:
- 各个层的类上添加组件注解(@Componet, @Autowired等)
- 在需要添加事务的方法上添加事务注解
@Transactional
事务注解注意:
- @Transactional关于事务的参数和xml一样
- 可以用在类上,那么该类下所有方法使用同一套注解配置