Spring事务

一,传统的事务

         对于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>


感谢李刚老师的教导.......

### 三级标题:Spring 事务管理概述 Spring 事务管理是一种用于管理数据库事务的机制,它允许开发者通过声明式或编程式的方式来控制事务的边界。声明式事务管理是通过 AOP(面向切面编程)实现的,它允许开发者通过配置文件或注解来定义事务规则,而无需在业务逻辑代码中显式地编写事务管理代码[^2]。 ### 三级标题:Spring 事务管理的使用 在 Spring 中,声明式事务管理可以通过 XML 配置文件或注解来实现。使用注解方式更为简洁,特别是在 Spring Boot 项目中。通过 `@Transactional` 注解,可以轻松地在服务层方法上声明事务边界。例如: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserDAO userDAO; @Transactional public User save(User user) { // 业务逻辑... return userDAO.save(user); } } ``` 此外,Spring 还支持分布式事务管理,可以通过集成 Seata 实现全局事务管理。例如: ```java @GlobalTransactional // 分布式事务注解 public void createOrder(Order order) { orderService.create(order); // 订单库操作 inventoryService.decreaseStock(); // 库存库操作 } ``` ### 三级标题:Spring 事务管理的常见问题及解决方案 在使用 Spring 事务管理时,可能会遇到一些常见问题,如事务不生效、超时和死锁等。为了解决这些问题,需要根据业务需求和性能要求选择合适的事务传播行为和隔离级别。同时,还需要注意事务的传播行为和隔离级别的配置是否正确,以及数据库是否支持事务[^1]。 ### 三级标题:Spring 事务管理的调试与监控 为了确保事务管理的正确性和性能,开启调试日志是非常关键的。通过日志可以监控事务的执行情况,及时发现并解决问题。例如,在 Spring Boot 应用中,可以在 `application.properties` 文件中设置日志级别: ```properties logging.level.org.springframework.transaction=DEBUG ``` ### 三级标题:Spring 事务管理的扩展 除了基本的事务管理功能之外,Spring 还提供了与 Hibernate 整合的事务管理方法,以及与其他框架如 MyBatis 的集成。此外,还可以通过 Spring Data JPA 来简化数据访问层的事务管理[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值