Spring 学习笔记 (六):Transaction

简介:

  • Spring 用于事务管理的依赖包:spring-tx-x.x.x.jar
  • org.springframework.transation 包中核心接口:PlatformTransactionManager、TransactionDefinition、TransactionStatus

核心接口

  • PlatformTransactionManager:Spring 平台事务管理器,主要用于事务管理,由底层实现类负责具体事务管理,需要实现以下 3 个事务操作方法
    • 操作方法
      1. TransactionStatus getTransaction(@Nullable TransactionDefinition definition):获取事务状态信息
      2. void commit(TransactionStatus status):提交事务
      3. void rollback(TransactionStatus status):回滚事务
    • 实现类
      1. org.springframework.jdbc.datasource.DataSourceTransactionManager:配置 jdbc 数据源的事务管理器
      2. org.springframework.orm.hibernate4.HibernateTransactionManager:配置 Hibernate 的事务管理器
      3. 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,获取事务是否完成

管理方式:

  • 编程式事务管理:编写代码实现事务管理,包括
    1. 定义事务的开始
    2. 事务提交:正常执行事务
    3. 事务回滚:异常执行时
  • 声明式事务管理:通过 AOP 技术实现,将事务管理作为一个“切面”代码单独编写,然后将事务管理的“切面”代码织入到目标业务中。
    1. 基于 xml 方式的事务管理
    2. 基于 annotation 方式的事务管理

配置:

  • 基于 xml 方式的事务管理
    1. 导入 tx 和 aop 的命名空间
    2. 定义事务管理器 Bean,并为其注入数据管理源 Bean(即 Datasource)
    3. 通过 tx:advice详细配置信息)配置事务增强,绑定事务管理器并针对不同方法定义事务规则
    4. 将事务增强与方法切入点组合。
<?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&amp;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 方式的事务管理
    1. 在 Spring 容器中注册事务注解驱动:<tx:annotation-driven transaction-manager="transactionManager"/>
    2. 在需要使用事务的 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&amp;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>
posted @ 2021-03-17 15:13  Uyiefiz  阅读(258)  评论(0)    收藏  举报