Spring的事务管理,有两种方式实现,一种是在代码中编写,一种是声明式事务。在代码中编写要更加细粒度,而很多时候我们只需要简单的事务处理,那就可以用声明式事务。
Spring的事务管理器:
事务管理器实现 |
目标 |
org.springframework.jdbc.datasource.DataSourceTransactionManager |
在JDBC DataSource中管理事务 |
org.springframework.orm.hibernate.HIbernateTransactionManager |
管理Hibernate事务 |
org.springframework.orm.jdo.JdoTransactionManager |
管理JDO事务 |
org.springframework.transaction.jta.JtaTransactionManager |
使用一个JTA管理事务,在一个事务跨越多个资源时必须使用 |
org.springframework.orm.ojb.PersistenceBrokerTransactionManager |
管理Apache的OJB事务 |
这些事务管理器的的父类都是PlatformTransactionManager.
下面实例使用DataSourceTransactionManager来管理JDBC事务。
查看Spring的配置信息:(applicationContext.xml)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 5 6 <bean id="propertyConfig" 7 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 8 <property name="location"> 9 <value>connect.properties</value> 10 </property> 11 </bean> 12 13 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 14 <property name="driverClassName"> 15 <value>${db.driver}</value> 16 </property> 17 <property name="url"> 18 <value>${db.url}</value> 19 </property> 20 <property name="username"> 21 <value>${db.username}</value> 22 </property> 23 <property name="password"> 24 <value>${db.password}</value> 25 </property> 26 </bean> 27 28 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 29 <property name="dataSource"> 30 <ref bean="dataSource" /> 31 </property> 32 </bean> 33 34 <!-- JDBC事务管理器 --> 35 <bean id="transactionManager" 36 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 37 <property name="dataSource"> 38 <ref bean="dataSource" /> 39 </property> 40 </bean> 41 42 <!-- 声明事务模板 --> 43 <bean id="transactionTemplate" 44 class="org.springframework.transaction.support.TransactionTemplate"> 45 <property name="transactionManager"> 46 <ref bean="transactionManager" /> 47 </property> 48 </bean> 49 50 <bean id="bankDao" class="com.sunflower.dao.BankDaoImp"> 51 <property name="jdbcTemplate"> 52 <ref bean="jdbcTemplate" /> 53 </property> 54 <property name="transactionTemplate"> 55 <ref bean="transactionTemplate" /> 56 </property> 57 </bean> 58 </beans>
第34至第40行是配置DataSourceTransactionManager信息,要为其装配一个dataSource.
如果是要配置Hibernate事务,要进行如下配置:(配置一个sessionFactory)
1 <!-- Hibernate事务管理器 --> 2 <bean id="transactionManager" 3 class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 4 <property name="sessionFactory"> 5 <ref bean="sessionFactory" /> 6 </property> 7 </bean>
看到上面第42到48行,配置了一个org.springframework.transaction.support.TransactionTemplate实例,要在代码中添加事务,Spring为我们提供了一种方法就是使用TransactionTemplate类。我们要为TransactionTemplate装配一个TransactionManager,如上所示。
使用TransactionTemplate进行事务管理:
1 package com.sunflower.dao; 2 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 6 import org.springframework.jdbc.core.JdbcTemplate; 7 import org.springframework.jdbc.core.RowCallbackHandler; 8 import org.springframework.transaction.TransactionStatus; 9 import org.springframework.transaction.support.TransactionCallback; 10 import org.springframework.transaction.support.TransactionTemplate; 11 12 import com.sunflower.entity.People; 13 14 /** 15 * @author Caihanyuan 16 * @time 2012-10-7 下午03:50:45 17 */ 18 public class BankDaoImp implements BankDao { 19 private JdbcTemplate jdbcTemplate; 20 private TransactionTemplate transactionTemplate; 21 22 public JdbcTemplate getJdbcTemplate() { 23 return jdbcTemplate; 24 } 25 26 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { 27 this.jdbcTemplate = jdbcTemplate; 28 } 29 30 public TransactionTemplate getTransactionTemplate() { 31 return transactionTemplate; 32 } 33 34 public void setTransactionTemplate(TransactionTemplate transactionTemplate) { 35 this.transactionTemplate = transactionTemplate; 36 } 37 38 @Override 39 public double getMoney(final People people) { 40 double money = people.getMoney(); 41 // 开始事务,如果出现状况则回滚 42 transactionTemplate.execute(new TransactionCallback<People>() { 43 @Override 44 public People doInTransaction(TransactionStatus ts) { 45 try { 46 final People people2 = new People(); 47 // 使用JdbcTemplate进行持久化层操作 48 String sql = "select money from bank where name = ?"; 49 Object[] params = new Object[] { people.getName() }; 50 // 查询 51 jdbcTemplate.query(sql, params, new RowCallbackHandler() { 52 @Override 53 public void processRow(ResultSet rs) 54 throws SQLException { 55 people2.setMoney(rs.getDouble("money")); 56 System.out.println(people.getName() + "用户还有" 57 + rs.getDouble("money") + "元余款"); 58 System.out.println(people.getName() + "要从账户中取出" 59 + people.getMoney() + "元"); 60 if (people2.getMoney() < people.getMoney()) { 61 System.out.println("余额不足"); 62 people.setMoney(-1); 63 return; 64 } 65 } 66 }); 67 68 if (people.getMoney() < 0) 69 return null; 70 else { 71 sql = "update bank set money = ? where name = ?"; 72 Object[] params2 = new Object[] { 73 people2.getMoney() - people.getMoney(), 74 people.getName() }; 75 jdbcTemplate.update(sql, params2); 76 System.out.println("剩余余额:" 77 + (people2.getMoney() - people.getMoney())); 78 } 79 } 80 catch (Exception e) { 81 ts.setRollbackOnly(); 82 } 83 84 // 如果成功,事务被提交 85 return people; 86 } 87 }); 88 89 return people.getMoney(); 90 } 91 }
调用TransactionTemplate实例的execute()方法将执行包含在TransactionCallback实例里的代码。如果代码出现异常,调用TransactionStatus对象的setRollbackOnly()将事务回滚。否则,如果doInTransaction()方法正常返回,事务将被提交。
源代码下载:http://pan.baidu.com/share/link?shareid=81844&uk=2198762756
声明式事务:spring_声明式事务
相关推荐
Spring事务管理就是围绕这些特性来确保数据的一致性。 四、事务的传播行为 在Spring中,我们可以配置事务的传播行为,比如REQUIRED(默认,如果当前存在事务,则加入当前事务,否则新建一个事务)、PROPAGATION_...
#### 一、Spring事务管理概述 Spring框架为开发者提供了一套强大的事务管理机制,它简化了应用程序中的事务控制逻辑,使得开发人员能够更加专注于业务逻辑的编写,而不是繁琐的事务管理代码。Spring支持两种类型的...
Spring 框架的事务管理是其核心特性之一,它为开发者提供了强大的支持,确保了在多线程和并发环境中数据的一致性和完整性。本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异...
本篇文章将深入探讨Spring事务管理的基础知识、工作原理以及如何在实际项目中应用。 首先,事务是数据库操作的基本单位,它确保了一组操作要么全部成功,要么全部失败,从而保证了数据的完整性和一致性。在Spring中...
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
7. **事务管理**:Spring提供声明式事务管理,通过在方法上添加`@Transactional`注解,可以自动处理事务的开始、提交、回滚等操作,降低了事务管理的复杂性。 8. **Spring Boot**:Spring Boot是Spring的简化版本,...
通过Spring的事务管理,开发者可以声明式地控制事务边界,使得事务处理更加透明和可靠。同时,Spring的AOP能力也可以用于增强HibernateTemplate,例如添加自定义的后置处理逻辑。 **文件名称列表分析** 由于只有一...
在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器...这将加深你对Spring事务管理的理解,帮助你在实际项目中更加熟练地运用这些技术。
2. 事务管理:详述Spring的事务管理特性,包括编程式和声明式事务管理,以及在不同类型的数据库上实现事务一致性。 第三部分,6.Spring_in_Action中文版(第二版)_part06.pdf,可能涉及Spring的Web开发和集成其他...
Spring框架是Java开发中最常用的轻量级开源框架之一,它为开发者提供了丰富的功能,包括依赖注入、面向切面编程、事务管理以及数据访问等。"spring_api+spring_reference中文版"是一个包含Spring框架API和参考指南的...
在Java Web开发中,Spring AOP通常用于实现如日志记录、权限控制、事务管理等跨功能的需求。下面将详细介绍Spring AOP的关键概念和实现方式。 1. **切面(Aspect)**:切面是Spring AOP的核心,它封装了系统中的...
AOP是Spring框架的重要特性,它允许程序员定义"横切关注点",如日志、事务管理等,这些关注点可以跨多个对象进行传播,而无需侵入每个对象的代码。 - 文件中的例子可能包括如何定义切面、通知类型(前置、后置、...
3. **Spring AOP**: 支持面向切面编程,允许定义横切关注点,如日志、事务管理,从而解耦业务逻辑。 4. **Spring Web**: 包括Web-Servlet模块,提供了一个模型-视图-控制器(MVC)架构来构建Web应用,还有Web-MVC的...
实验 "Spring 声明事务" 是 Java 高级编程中的一个重要环节,旨在让学生掌握 Spring 框架中声明式事务管理的配置和使用。在实际应用中,事务管理是确保数据一致性、完整性和可靠性的关键组件。Spring 提供了声明式...
本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...
了解Spring框架的基本知识后,我们可以深入探讨如何配置和使用Spring的IoC容器、如何编写面向接口的代码并通过依赖注入实现解耦、如何使用AOP进行横切关注点的处理,如日志记录和事务管理。此外,还可以学习Spring ...
总结来说,`Spring_tx编程式事务代码`主要涉及Spring的`TransactionTemplate`类,它是Spring事务管理的一种便捷工具,可以帮助开发者以编程的方式更加方便地控制事务的生命周期,同时保持代码的简洁和可维护性。...
在本系统中,Spring被用作服务层的容器,管理并协调各组件之间的依赖关系,同时提供了事务管理、数据源配置等关键服务。 结合这三个框架,物资管理系统能够实现以下功能: - 物资入库:通过Struts接收前端请求,...