Spring 学习笔记 (六):Transaction
简介:
- Spring 用于事务管理的依赖包:spring-tx-x.x.x.jar
- org.springframework.transation 包中核心接口:PlatformTransactionManager、TransactionDefinition、TransactionStatus
核心接口:
- PlatformTransactionManager:Spring 平台事务管理器,主要用于事务管理,由底层实现类负责具体事务管理,需要实现以下 3 个事务操作方法
- 操作方法
- TransactionStatus getTransaction(@Nullable TransactionDefinition definition):获取事务状态信息
- void commit(TransactionStatus status):提交事务
- void rollback(TransactionStatus status):回滚事务
- 实现类
- org.springframework.jdbc.datasource.DataSourceTransactionManager:配置 jdbc 数据源的事务管理器
- org.springframework.orm.hibernate4.HibernateTransactionManager:配置 Hibernate 的事务管理器
- org.springframework.transaction.jta.JtaTransactionManager:配置全局事务管理器
- 操作方法
- TransactionDefinition:主要用于事务定义(描述),定义了事务规则,提供了获取事务相关信息的方法
1. String getName():获取事务对象名
2. int getIsolationLevel():获取事务隔离级别
![]()
3. int getPropagationBehavior():获取事务传播行为,传播行为控制是否需要创建事务及如何创建事务。Spring 默认为 REQUIRED。
![]()
4. int getTimeout():获取事务超时时间
5. boolean isReadOnly():获取事务是否只读设置 - TransactionStatus:指事务的状态,描述了某个时间点上事务的状态信息。
1. void flush():刷新事务
2. boolean hasSavepoint():获取是否存在保存点
3. boolean isNewTransaction():继承自 TransactionExecution,获取是否是新事务
4. void setRollbackOnly():继承自 TransactionExecution,设置事务回滚
5. boolean isRollbackOnly():继承自 TransactionExecution,获取是否回滚
6. boolean isCompleted():继承自 TransactionExecution,获取事务是否完成
管理方式:
- 编程式事务管理:编写代码实现事务管理,包括
- 定义事务的开始
- 事务提交:正常执行事务
- 事务回滚:异常执行时
- 声明式事务管理:通过 AOP 技术实现,将事务管理作为一个“切面”代码单独编写,然后将事务管理的“切面”代码织入到目标业务中。
- 基于 xml 方式的事务管理
- 基于 annotation 方式的事务管理
配置:
<?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-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<!-- 1配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--数据库驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<!--连接数据库的url -->
<property name="url" value="jdbc:mysql://192.168.0.100:3306/testdb?useUnicode=true&characterEncoding=utf8" />
<!--连接数据库的用户名 -->
<property name="username" value="abcde" />
<!--连接数据库的密码 -->
<property name="password" value="password" />
</bean>
<!-- 2 配置JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 默认必须使用数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!--3 定义id为accountDao的Bean-->
<bean id="accountDao" class="cn.test.dao.UserAccountDaoImpl">
<!-- 将jdbcTemplate注入到accountDao实例中 -->
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<!-- 4.事务管理器,依赖于数据源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 5.编写通知:对事务进行增强(通知),需要编写对切入点和具体执行事务细节 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- name:*表示任意方法名称 -->
<tx:method name="*" propagation="REQUIRED" isolation="DEFAULT" read-only="false" />
</tx:attributes>
</tx:advice>
<!-- 6.编写aop,让spring自动对目标生成代理,需要使用AspectJ的表达式 -->
<aop:config>
<!-- 切入点 -->
<aop:pointcut expression="execution(* cn.test.dao.*.*(..))" id="txPointCut" />
<!-- 切面:将切入点与通知整合 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
</aop:config>
</beans>
- 基于 annotation 方式的事务管理
- 在 Spring 容器中注册事务注解驱动:<tx:annotation-driven transaction-manager="transactionManager"/>
- 在需要使用事务的 Spring Bean 类或者 Bean 类的方法上添加注解 @Transactional。
- 如果将注解添加在 Bean 类上,则表示事务的设置对整个 Bean 类的所有方法都起作用;
- 如果将注解添加在 Bean 类中的某个方法上,则表示事务的设置只对该方法有效。
<?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-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<!-- 1配置数据源 -->
<bean id="dataSource" class=
"org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--数据库驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<!--连接数据库的url -->
<property name="url" value="jdbc:mysql://192.168.0.100:3306/testdb?useUnicode=true&characterEncoding=utf8" />
<!--连接数据库的用户名 -->
<property name="username" value="abcde" />
<!--连接数据库的密码 -->
<property name="password" value="password" />
</bean>
<!-- 2 配置JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 默认必须使用数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!--3 定义id为accountDao的Bean-->
<bean id="accountDao" class="cn.test.dao.UserAccountDaoImpl">
<!-- 将jdbcTemplate注入到accountDao实例中 -->
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<!-- 4.事务管理器,依赖于数据源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 5.注册事务管理器驱动 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>



浙公网安备 33010602011771号