Spring的编程式事物管理直接继承自PlatformTransactionManag er接口。根据不同的Dao技术,Spring提供了不同的PlatformTransactionManager实现类,这里只介绍针对Hibernate的实现方式,如下:
在应用中我们可以直接使用HibernateTransactionManager的实例进行事物管理。/WEB-INF/mvc-config.xml和上个例子没有什么不同,下面是/WEB-INF/data-access.xml:<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--PropertyPlaceholderConfigurer-->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>WEB-INF/props/jdbc.properties</value>
</list>
</property>
</bean>
<!--org.apache.commons.dbcp.BasicDataSource has the connect pool-->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>${jdbc.driverClassName}</value>
</property>
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
</bean>
<!--sessionFactory-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
destroy-method="close">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>com/yangsq/orm/user.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
${hibernate.dialect}
</prop>
</props>
</property>
</bean>
<!--HibernateTransactionManager-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!--userDao-->
<bean id="userDao"
class="com.yangsq.dao.impl.UserDaoImpl"
init-method="createTransactionDefinition">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
</bean>
</beans>
定义了一个HibernateTransactionManager的实例,并把它注入到我们要进行事物管理的 UserDaoImpl类。在bean的管理周期中,bean的初始化顺序是生成bean实例(构造方法),执行setter注入,执行init- method属性定义的函数(简化版,呵呵:)。我们针对以前的UserDaoImpl类进行修改,增加事物管理代码部分,如下:import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import com.yangsq.dao.UserDao;
import com.yangsq.domain.User;
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
private HibernateTransactionManager transactionManager;
private DefaultTransactionDefinition def;
public HibernateTransactionManager getTransactionManager() {
return transactionManager;
}
public void setTransactionManager(HibernateTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void createTransactionDefinition(){
def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
}
public void saveOrUpdate(User user){
TransactionStatus status = transactionManager.getTransaction(def);
try{
this.getHibernateTemplate().saveOrUpdate(user);
}catch(DataAccessException ex){
transactionManager.rollback(status);
throw ex;
}
transactionManager.commit(status);
}
......
}
生成UserDaoImpl实例后,注入transactionManager方法,然后执行createTransactionDefinition,在这个函数里,定义了事物的一些参数,如传播行为,隔离级别等。下面是TransactionDefinition的继承图谱及主要参数:
在调用transactionManager的getTransaction方法后,返回一个TansactionStatus实 例,TansactionStatus接口定义了事物执行时的状态。执行saveOrUpdate溢出后,将回滚(rollback),否则提交 (commit)。
在实际断点执行时(断点在saveOrUpdate处),执行完saveOrUpdate,察看数据库后,数据并没有插入,只有当执行完transactionManager.commit后,数据才真正插入到数据库中。
工程的其他部分与原来的例子一模一样,执行效果也不变。
分享到:
相关推荐
1. **Spring编程式事务管理**: 编程式事务管理允许开发者在代码中直接控制事务的开始、提交、回滚等操作。这种方式提供了更大的灵活性,但可能导致事务管理代码分散在整个应用中,增加维护难度。通常,这种方式...
Spring 编程式事务与声明式事务详解 本文将详细解释 Spring 的编程式事务管理及声明式事务管理,帮助读者理清思路。 事务管理的重要性 事务管理对于企业应用至关重要。它保证了用户的每一次操作都是可靠的,即便...
Spring 声明式事务和Spring 编程式事务
在本篇“Spring学习笔记(十五)——编程式事务例子”中,我们将深入探讨Spring框架中的编程式事务管理。在实际开发中,我们通常使用声明式事务管理,它基于AOP(面向切面编程)来简化事务处理。然而,有时为了更细...
编程式事务管理允许开发者通过代码来精确控制事务的边界,而`TransactionTemplate`就是Spring为编程式事务管理提供的一种便捷工具。 `TransactionTemplate`类是Spring框架的`org.springframework.transaction....
Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 **编程式事务管理**是通过编写代码来显式地管理事务的开始、提交、回滚等操作。在Spring中,可以使用PlatformTransactionManager接口的实现...
当我们谈论“Spring编程式事务”时,这涉及到Spring框架中对数据库事务的管理方式之一。 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理是指在代码中显式地控制事务的开始、提交、...
本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...
通过学习这一章节,你将能够熟练掌握Spring编程式事务的使用,理解事务管理的核心原理,并能在实际开发中灵活应用。结合提供的"Java开发Java经验技巧共34页.pdf"文档,你将获得更深入的理论知识和实践经验。同时,...
详解Spring学习之编程式事务管理 Spring框架中提供了两种事务管理方式:编程式事务管理和声明式事务管理。在本篇文章中,我们主要介绍编程式事务管理。 什么是编程式事务管理? 编程式事务管理是指通过编写代码...
**示例:Spring编程式事务管理** Spring框架通过提供一系列事务管理相关的类,如`TransactionDefinition`、`TransactionStatus`和`PlatformTransactionManager`等,简化了编程式事务管理的过程。 ```java // 假设...
本主题将深入探讨Hibernate的编程式事务管理和Spring AOP的声明式事务管理,以及两者如何在实际项目中集成使用。 **Hibernate编程式事务管理** Hibernate作为流行的ORM(对象关系映射)框架,提供了对JDBC事务的...
本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...
在本篇"Spring学习之八--Hibernate编程式事务"中,我们将探讨如何在Spring框架中使用Hibernate进行编程式事务管理。编程式事务管理是相对于声明式事务管理的一种方式,它允许开发者通过代码来显式控制事务的开始、...
本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务管理的基本概念。事务是一组数据库操作,这些操作要么全部执行,要么全部回滚,...
本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异与应用场景。 首先,编程式事务管理依赖于编程的方式显式地控制事务的开始、提交、回滚等操作。它通过实现 `...
2. **Spring编程式事务管理**:虽然不如声明式事务方便,但在某些复杂场景下,如需要自定义事务处理逻辑,编程式事务管理提供了更多的灵活性。通过TransactionTemplate或PlatformTransactionManager接口,开发者可以...
Spring 中的事务处理可以分为两种方式:声明式事务处理和编程式事务处理。声明式事务处理通过 AOP 的实现,把事务管理代码作为方面封装到业务代码中,使得事务管理代码和业务代码解藕。这使得事务管理变得更加灵活...