`
dyllove98
  • 浏览: 1405447 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:39059
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:80062
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:133167
社区版块
存档分类
最新评论

Spring_事务管理

 
阅读更多

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事务管理就是围绕这些特性来确保数据的一致性。 四、事务的传播行为 在Spring中,我们可以配置事务的传播行为,比如REQUIRED(默认,如果当前存在事务,则加入当前事务,否则新建一个事务)、PROPAGATION_...

    spring_如何管理事务的

    #### 一、Spring事务管理概述 Spring框架为开发者提供了一套强大的事务管理机制,它简化了应用程序中的事务控制逻辑,使得开发人员能够更加专注于业务逻辑的编写,而不是繁琐的事务管理代码。Spring支持两种类型的...

    全面分析_Spring_的编程式事务管理及声明式事务管理

    Spring 框架的事务管理是其核心特性之一,它为开发者提供了强大的支持,确保了在多线程和并发环境中数据的一致性和完整性。本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异...

    Spring_tx事务

    本篇文章将深入探讨Spring事务管理的基础知识、工作原理以及如何在实际项目中应用。 首先,事务是数据库操作的基本单位,它确保了一组操作要么全部成功,要么全部失败,从而保证了数据的完整性和一致性。在Spring中...

    Spring事务管理Demo

    Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...

    spring_day01

    7. **事务管理**:Spring提供声明式事务管理,通过在方法上添加`@Transactional`注解,可以自动处理事务的开始、提交、回滚等操作,降低了事务管理的复杂性。 8. **Spring Boot**:Spring Boot是Spring的简化版本,...

    Spring_2000_Spring_Hibernate_HibernateTemplate

    通过Spring的事务管理,开发者可以声明式地控制事务边界,使得事务处理更加透明和可靠。同时,Spring的AOP能力也可以用于增强HibernateTemplate,例如添加自定义的后置处理逻辑。 **文件名称列表分析** 由于只有一...

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器...这将加深你对Spring事务管理的理解,帮助你在实际项目中更加熟练地运用这些技术。

    Spring_in_Action中文版(第二版)

    2. 事务管理:详述Spring的事务管理特性,包括编程式和声明式事务管理,以及在不同类型的数据库上实现事务一致性。 第三部分,6.Spring_in_Action中文版(第二版)_part06.pdf,可能涉及Spring的Web开发和集成其他...

    spring_api+spring_reference中文版

    Spring框架是Java开发中最常用的轻量级开源框架之一,它为开发者提供了丰富的功能,包括依赖注入、面向切面编程、事务管理以及数据访问等。"spring_api+spring_reference中文版"是一个包含Spring框架API和参考指南的...

    spring_aop.rar_spring_aop

    在Java Web开发中,Spring AOP通常用于实现如日志记录、权限控制、事务管理等跨功能的需求。下面将详细介绍Spring AOP的关键概念和实现方式。 1. **切面(Aspect)**:切面是Spring AOP的核心,它封装了系统中的...

    王勇_JAVA教程_Spring_源代

    AOP是Spring框架的重要特性,它允许程序员定义"横切关注点",如日志、事务管理等,这些关注点可以跨多个对象进行传播,而无需侵入每个对象的代码。 - 文件中的例子可能包括如何定义切面、通知类型(前置、后置、...

    spring_day06_spring_

    3. **Spring AOP**: 支持面向切面编程,允许定义横切关注点,如日志、事务管理,从而解耦业务逻辑。 4. **Spring Web**: 包括Web-Servlet模块,提供了一个模型-视图-控制器(MVC)架构来构建Web应用,还有Web-MVC的...

    实验 spring 声明事务

    实验 "Spring 声明事务" 是 Java 高级编程中的一个重要环节,旨在让学生掌握 Spring 框架中声明式事务管理的配置和使用。在实际应用中,事务管理是确保数据一致性、完整性和可靠性的关键组件。Spring 提供了声明式...

    全面分析_Spring_的编程式事务管理及声明式事务管理.

    本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...

    SpringTest_springtest_spring_java_Framework_

    了解Spring框架的基本知识后,我们可以深入探讨如何配置和使用Spring的IoC容器、如何编写面向接口的代码并通过依赖注入实现解耦、如何使用AOP进行横切关注点的处理,如日志记录和事务管理。此外,还可以学习Spring ...

    spring_tx编程式事务代码

    总结来说,`Spring_tx编程式事务代码`主要涉及Spring的`TransactionTemplate`类,它是Spring事务管理的一种便捷工具,可以帮助开发者以编程的方式更加方便地控制事务的生命周期,同时保持代码的简洁和可维护性。...

    aa.rar_spring_struts_struts 管理_物资管理 java_管理系统

    在本系统中,Spring被用作服务层的容器,管理并协调各组件之间的依赖关系,同时提供了事务管理、数据源配置等关键服务。 结合这三个框架,物资管理系统能够实现以下功能: - 物资入库:通过Struts接收前端请求,...

Global site tag (gtag.js) - Google Analytics