spring 事务(1事务的基本理解和实现声明式事务管理)

时间:2022-05-15 16:37:12

1.事务理解和spring框架的事务简介

a.个人理解:事务是执行某个过程的整体

b.百度百科指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
c.Spring框架引人注目的重要因素之一是它全面的事务支持。Spring框架提供了一致的事务管理抽象,这带来了以下好处:

为复杂的事务API提供了一致的编程模型,如JTA、JDBC、Hibernate、JPA和JDO

支持 声明式事务管理

提供比大多数复杂的事务API(诸如JTA)更简单的,更易于使用的编程式 事务管理API

非常好地整合Spring的各种数据访问抽象




2.spring事务接口

Spring的事务管理接口主要有三个:TransactionDefinition、Platform TransactionManager、Transaction Status。

①在Spring中,事务是通过TransactionDefinition接口来定义的,该接口包含与事务属性相关的方法,TransactionDefinition定义了五个表示隔离级别的常量,代表传播行为的常量,在TransactionDefinition中以int值表示超时时间。

②Platform TransactionManager.getInstance()方法返回一个Transaction Status对象,返回的Transaction Status对象可能代表一个新的或已经存在的事务(如果当前调用堆栈中有一个符合条件的事务)。

③Transaction Status接口提供了一个简单的控制事务查询和执行的方法。


Spring事务管理涉及的接口的联系如下:
spring 事务(1事务的基本理解和实现声明式事务管理)
3声明式事务
Spring也提供了声明式事务管理。这是通过Spring AOP实现的。 


Spring 中进行事务管理的通常方式是利用AOP(面向切片编程)的方式,为普通java类封装事务控制,它是通过动态代理实现的,由于接口是延迟实例化的, spring在这段时间内通过拦截器,加载事务切片。原理就是这样,具体细节请参考jdk中有关动态代理的文档。

具体见参考博客点击打开链接


4.声明式事务的实现

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

    DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。

spring 事务(1事务的基本理解和实现声明式事务管理)


 代理单个bean的方式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

">
<!--第0步:让程序识别到jdbc.properties文件-->
<context:property-placeholder location="config.properties"></context:property-placeholder>

<!--第一步:1.1数据源-->
<!--Spring内置jdbc的数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${config.driver}"></property>
<property name="url" value="${config.url}"></property>
<property name="username" value="${config.username}"></property>
<property name="password" value="${config.password}"></property>
</bean>

<!--第二部:1.2 JDBCTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--第三步:1.3 Dao-->
<bean id="accountDao" class="cn.spring.Service16Transaction.dao.AccountDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>

<bean id="stockDao" class="cn.spring.Service16Transaction.dao.StockDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<!--第四步: 1.4 service userService-->
<bean id="userService" class="cn.spring.Service16Transaction.service.UserImpl">
<property name="accountDao" ref="accountDao"></property>
<property name="stockDao" ref="stockDao"></property>
</bean>
<!--事务管理器 被别人引用-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--事务代理工厂-->
<bean id="userProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!--引用事务管理器-->
<property name="transactionManager" ref="transactionManager"></property>
<!--目标对象-->
<property name="target" ref="userService"></property>
<!--怎样增强 有一些特定的过滤-->
<property name="transactionAttributes">
<props>
<prop key="add*"><!--事务的隔离级别-->ISOLATION_DEFAULT,<!--事务的传播机制-->PROPAGATION_REQUIRED</prop>
<prop key="buy*">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-StockException</prop>
</props>

</property>
</bean>
</beans>