一,传统的事务
对于j2ee传统来说,事务策略有两种: 1. 基于底层服务器JTA支持的全局事务(应用服务器需要参与事务管理); 2.基于底层持久化技术的局部事务(应用服务器不参与事务管理)
------->2.1应用服务器不参与管理的影响是:跨事务性资源的正确性不能保证! ------->2.2底层持久化技术(即连接数据库技术)是有很多种的,因此不同类型的底层持久化技术就有不同的操作方式 如:JDBC----->Connection对象操作事务 Hibernate--------->Session对象来操作事务
但是在传统的j2ee中底层持久化技术是把数据连接技术和代码耦合在一起,若是换一种持久化技术,那么必须手动改代码.正是因为麻烦,所以spring事务管理出现了
二,spring事务管理
1.核心接口: PlatformTransactionManager接口,因为该接口没有与任何事务资源捆绑所以它在持久化技术中能够实现跳平台(即可以适应任何的事务策略)从而将应用和持久化技术,事务API彻底分离开来.
2.PlatformTransactionManager接口的三个接口:
2.1 TransactionStatus getTransaction(TransactionDefinitiondefinition)throws TransactionException;
2.2 void commit(TransactionStatus Status )throws TransactionException;
2.3 void rollback(TransactionStatus Status)throws TransactionException;
TransactionStatus也是一个接口 意思是代表事务本身,它提供了简单的控制事务执行和查询事务状态的方法,有 isnewtransaction()方法//判断事务是否为新建事务;setrollbackonly()方法//查询事务回滚;isrollbackonly()方法:查询是否已经有回滚标志
该TransactionDefinition接口是定义了一个事务规则,该接口必须指定如下几个属性值:
1.事务隔离:
2.事务传播:
3.事务超时:事务最长持续时间
4.只读状态:只读事务不修改任何数据.
三,提供PlatformTransactionManager实现类的配置,以及hibernate Jdbc持久化访问技术配置
JDBC数据源的局部事务策略的配置文件
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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
">
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="clone">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost/j2ee"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
<property name="maxPoolSize" value="40"/>
<property name="minPoolSize" value="1"/>
<!-- 指定连接数据库连接池的初始化连接数 -->
<property name="initialPoolSize" value="1"/>
<!-- 指定连接数据库连接池的连接最大的空闲时间 -->
<property name="maxIdleTime" value="20"/>
</bean>
<!-- 配置JDBC数据库的局部事务管理器,使用DataSourceTransactionManager类 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
容器管理的JTA全局事务的配置文件
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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
">
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/jpetstore"/>
</bean>
<!-- 使用JtaTransactionManager类,该类实现platformTransactionManager接口 -->
<!-- 针对采用全局事务管理的特定实现. -->
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager"/>
</beans>
采用hibernate持久层访问,局部事务策略 的 spring配置文件
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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
">
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="clone">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost/j2ee"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
<property name="maxPoolSize" value="40"/>
<property name="minPoolSize" value="1"/>
<!-- 指定连接数据库连接池的初始化连接数 -->
<property name="initialPoolSize" value="1"/>
<!-- 指定连接数据库连接池的连接最大的空闲时间 -->
<property name="maxIdleTime" value="20"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>lee/MyTest.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<!-- 指定hibernate的连接方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
<!-- 是否根据Hibernate映射创建数据表 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!-- 配置hibernate的局部事务管理器,使用hibernateTransactionManager类 -->
<!-- hibernateTransactionManager类 是PlatformTransactionManager接口针对采用Hibernate的特定实现类 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
底层采用hibernate持久层技术,但是事务依旧采用JTA全局事务的spring配置
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"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
">
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="clone">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost/j2ee"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
<property name="maxPoolSize" value="40"/>
<property name="minPoolSize" value="1"/>
<!-- 指定连接数据库连接池的初始化连接数 -->
<property name="initialPoolSize" value="1"/>
<!-- 指定连接数据库连接池的连接最大的空闲时间 -->
<property name="maxIdleTime" value="20"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>lee/MyTest.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<!-- 指定hibernate的连接方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
<!-- 是否根据Hibernate映射创建数据表 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!-- 使用JtaTransactionManager类,该类实现PlatformTransactionManager接口 -->
<!-- 针对采用全局事务管理的特定实现 -->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
</bean>
</beans>
感谢李刚老师的教导.......