引言:
最近在中心的课程学到了Spring框架的声明式事务管理章节,今天敲个小例子将我目前所知道的三种事务的管理方式做一个简单的对比,顺便巩固一下基础知识。
三种方式:纯JDBC、Hibernate、 Spring的AOP声明式事务管理。
都用相同的需求:在一个方法中一次保存两个用户信息,需要保证都成功插入数据库。否则,一方异常或失败,数据回滚至原始状态。比较典型的示例应该是银行转账业务。
(一)纯JDBC
纯JDBC主要是在持久化操作之前将数据提交事务的模式更改为不自动提交,
关键代码:conn.setAutoCommit(false); 默认情况下,新连接处于自动提交模式。
在数据库关闭之前,如果一切操作正常,显示提交事务:conn.commit();
如果发生了异常,显示回滚事务:conn.rollback();
/**
* conn.setAutoCommit(true|false)
* 纯JDBC事务管理方式测试类
*/
package com.accp.transactiontest.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.ParseException;
import com.accp.transactiontest.dao.base.ConnectionManager;
import com.accp.transactiontest.entity.Userinfo;
/**
* @author Maxpin by 2011-07-25
*
*/
public class JDBCTest {
/**
* 一次必须保存两个用户信息的方法
*
* @param user1
* 用户1
* @param user2
* 用户2
*/
public static void saveUserinfo(Userinfo user1, Userinfo user2) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 获取数据库连接
conn = ConnectionManager.getConnection();
/*
* 设置不使用自动提交事务的方式
*/
conn.setAutoCommit(false);
// 用户1
String sql = "insert into USERINFO(USERID,USERNAME,AGE,POINT) values(SEQ_ID.NEXTVAL,?,?,?)"; // 构建SQL语句
pstmt = conn.prepareStatement(sql); // 创建命令对象
pstmt.setString(1, user1.getUsername()); // 设置占位符参数
pstmt.setShort(2, user1.getAge());
pstmt.setString(3, user1.getPoint());
pstmt.executeUpdate(); // 执行操作
// 用户2
sql = "insert into USERINFO(USERID,USERNAME,AGE,POINT) values(SEQ_ID.NEXTVAL,?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user2.getUsername());
pstmt.setShort(2, user2.getAge());
pstmt.setString(3, user2.getPoint());
pstmt.executeUpdate();
/*
* 显示提交事务
*/
conn.commit();
} catch (Exception ex) {
ex.printStackTrace();
try {
/*
* 异常则显示回滚事务
*/
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
} finally {
// 关闭数据库连接
ConnectionManager.closeConnection(null, pstmt, conn);
}
}
/**
* main方法
*
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
saveUserinfo(new Userinfo("程七七1", (short) 21, "1,3"),
new Userinfo("程七七2", (short) 22, "4,2"));
}
}
(二)Hibernate
Hibernate在持久化操作增、删、改时需要显示开启一个事务Transaction tx = session.beginTransaction(); (查询可不用)。
对于单独的事务管理方面来说,Hibernate同样需要显示提交事务tx.commit();,显示回滚事务tx.rollback();。
如下Demo的main方法里的 用户2 的名字设置大于数据库中的字段最大值,因此会有异常。try/catch中捕获异常后显示回滚,正好做到需求描述的要求。
/**
* tx.commit()|tx.rollback();
* Hibernate事务管理方式测试类
*/
package com.accp.transactiontest.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.accp.transactiontest.dao.base.HibernateUtil;
import com.accp.transactiontest.entity.Userinfo;
/**
* @author Maxpin by 2011-07-25
*
*/
public class HibernateTest {
/**
* 一次必须保存两个用户信息的方法
*
* @param user1
* 用户1
* @param user2
* 用户2
*/
public static void saveUserinfo(Userinfo user1, Userinfo user2) {
Session session = HibernateUtil.getSession(); // 得到Session
Transaction tx = session.beginTransaction();// 显示开启一个事务
try {
session.save(user1); // 保存用户1
session.save(user2); // 保存用户2
/*
* 显示提交事务
*/
tx.commit();
} catch (Exception ex) {
ex.printStackTrace();
/*
* 异常则显示回滚事务
*/</span>
tx.rollback();
} finally {
HibernateUtil.closeSession(); // 关闭Session
}
}
/**
* main方法
* @param args
*/
public static void main(String[] args) {
saveUserinfo(new Userinfo("周八八1", (short) 21, "1,3"),
new Userinfo("周八八八八八八八八八2", (short) 22, "4,2"));
}
}
(三)Spring的AOP
这里只贴出了 Spring 框架的 applicationContext.xml配置文件中的代码段。(其他JavaBean略)
通过使用代理拦截所有的方法调用。如果方法名位于事务配置中,代理就是起到通知的作用。
它会在目标方法调用前开启事务,然后在一个 try/catch 块中执行目标方法。
如果目标方法正常完成,代理就会提交事务;
如果目标方法抛出运行时异常,代理就会进行回滚。
配置如下:
<!-- 1、导入tx和aop命名空间 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 2、为txManager(HibernateTransactionManager)注入sessionFaction -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 3、定义txManager的事务通知txAdvice -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- 定义属性,声明事务规则 -->
<tx:attributes>
<!-- 查询操作为只读事务 -->
<tx:method name="get*" read-only="true" />
<!-- 增删改及其他操作没有事务就创建新事务,否则用已有事务 -->
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- aop面相切面编程的配置文件 -->
<aop:config>
<!-- 设置切入点 -->
<aop:pointcut id="bizMethod" expression="execution(* com.accp.transactiontest2.biz.impl.*.*(..))" />
<!-- 组合事务通知和切入点 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethod"/>
</aop:config>
相关推荐
本主题将深入探讨Hibernate的编程式事务管理和Spring AOP的声明式事务管理,以及两者如何在实际项目中集成使用。 **Hibernate编程式事务管理** Hibernate作为流行的ORM(对象关系映射)框架,提供了对JDBC事务的...
本篇将详细介绍如何在Spring 3和Hibernate 4中通过注解来实现声明式事务管理。 首先,我们需要在项目中引入Spring和Hibernate的依赖库。这通常通过Maven或Gradle等构建工具完成,确保添加了相应的依赖项。 接着,...
本篇将详细介绍如何在Spring 3和Hibernate 4中配置声明式事务管理,采用注解方式。 一、Spring的事务管理 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用...
编程式事务管理需要开发者显式调用开始、提交、回滚等事务管理API,而声明式事务管理则更简洁,只需要在配置中声明事务属性,由Spring自动处理事务的生命周期。 在Hibernate中,事务通常与数据库连接紧密相关,通过...
在Spring框架中,声明式事务管理是实现事务处理的一种高效且灵活的方式,它允许开发者通过在服务层方法上添加特定的注解来控制事务的边界,而无需编写大量的事务管理代码。这种方式使得业务逻辑和事务控制得以分离,...
Spring 声明式事务管理是Spring框架中的一个重要特性,它允许开发者在不编写任何事务管理代码的情况下,通过配置来管理事务。这种方式极大地简化了事务处理,并提高了代码的可维护性。以下是关于Spring声明式事务...
Spring提供了声明式事务管理,这使得事务管理代码不再需要硬编码到业务逻辑中,而是通过配置来实现。AOP代理可以在方法调用前后自动执行事务相关的操作,如开启、提交、回滚事务,大大提高了代码的整洁度。 3. **...
总结一下,Spring基于AOP实现的事务管理通过TransactionProxyFactoryBean,结合声明式事务配置,能够提供一种高效且易于维护的事务解决方案。它允许我们在不修改业务逻辑的情况下,统一管理和控制事务,提升了代码的...
在实际应用中,Spring 的声明式事务管理不仅限于JDBC,还支持其他数据访问技术,如Hibernate、MyBatis等。同时,Spring还提供了编程式事务管理,允许开发者在代码中手动管理事务,但这种方式通常在更复杂的场景或...
在Spring框架中,声明式事务管理是一种非常重要的特性,它允许开发者通过XML配置或注解来定义事务的边界,而无需在业务代码中显式地管理事务。这种方式极大地提高了代码的可读性和可维护性。本篇文章将深入探讨如何...
本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...
Spring3和Hibernate4的集成可以帮助开发者实现高效、灵活的持久化层管理,并通过声明式事务管理来保证数据的一致性。本教程将深入探讨如何使用XML配置来设置Spring3和Hibernate4的声明式事务管理。 首先,我们需要...
Spring提供了一种统一的事务管理接口,支持编程式和声明式事务管理。编程式事务管理允许开发者在代码中显式地开始、提交、回滚事务;而声明式事务管理则更简单,通过在方法或类上添加注解,Spring会自动处理事务的...
本实例将深入探讨如何结合Spring的注解声明式事务管理与Hibernate的数据访问技术,构建一个完整的事务处理系统。 Spring框架以其灵活的依赖注入(DI)和面向切面编程(AOP)闻名,它允许开发者将事务管理从业务逻辑...
同样,Spring的声明式事务管理也可以应用到Hibernate上,只需将@Transactional注解添加到使用Hibernate的方法上,Spring就会自动处理事务的生命周期。此外,Spring还支持使用Hibernate的SessionFactory和...
在Spring框架中,声明式事务管理是实现事务处理的一种高效且灵活的方式,它允许开发者通过XML配置或注解来定义事务边界,而无需在业务逻辑代码中显式地调用开始、提交或回滚事务的方法。这篇博文"Spring使用XML配置...
声明式事务管理基于Spring的AOP,因此需要开启AOP代理。这可以通过在配置文件中添加以下行来实现: ```xml ``` 这行配置表示Spring会扫描带有@Transactional注解的方法,并自动为它们创建事务。 5. **在业务...
首先,声明式事务管理基于AOP(面向切面编程)实现,Spring通过代理模式在方法调用前后自动插入事务管理的代码。它主要通过两种方式实现:XML配置和注解驱动。 1. XML配置:在`<tx:advice>`元素中定义事务行为,...