`

纯JDBC、Hibernate、Spring的AOP声明式事务管理小结

    博客分类:
  • Java
阅读更多

引言:

最近在中心的课程学到了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>

 

分享到:
评论

相关推荐

    Spring3配置声明式事务

    在Spring3中配置声明式事务比早期版本显得更加简便。只需要几行配置文件+注解就可以实现面向切面的AOP事务

    spring源码分析(1-10)

    Spring源代码解析(六):Spring声明式事务处理 Spring源代码解析(七):Spring AOP中对拦截器调用的实现 Spring源代码解析(八):Spring驱动Hibernate的实现 Spring源代码解析(九):Spring Acegi框架鉴权的实现 ...

    Spring源代码解析

    Spring源代码解析(六):Spring声明式事务处理 Spring源代码解析(七):Spring AOP中对拦截器调用的实现 Spring源代码解析(八):Spring驱动Hibernate的实现 Spring源代码解析(九):Spring Acegi框架鉴权的实现 ...

    Spring源代码解析.rar

    Spring源代码解析6:Spring声明式事务处理 .doc Spring源代码解析7:Spring AOP中对拦截器调用的实现 .doc Spring源代码解析8:Spring驱动Hibernate的实现.doc Spring源代码解析9:Spring Acegi框架鉴权的实现.doc ...

    spring源码分析

    Spring源代码解析(六):Spring声明式事务处理 7. Spring源代码解析(七):Spring AOP中对拦截器调用的实现 8. Spring源代码解析(八):Spring驱动Hibernate的实现 9.Spring源代码解析(九):Spring Acegi...

    Spring源码学习文档,绝对值得好好研究~~

    Spring源代码解析(六):Spring声明式事务处理.doc Spring源代码解析(七):Spring AOP中对拦截器调用的实现.doc Spring源代码解析(八):Spring驱动Hibernate的实现.doc Spring源代码解析(九):Spring Acegi...

    Spring 源代码解析

    Spring源代码解析6:Spring声明式事务处理 ; Spring源代码解析7:Spring AOP中对拦截器调用的实现 Spring源代码解析8:Spring驱动Hibernate的实现;Spring源代码解析9:Spring Acegi框架鉴权的实现 Spring源...

    Spring框架 jar 架包 spring开发文档详解

    Spring BeanFactory Spring IOC(控制翻转)/DI(依赖注入) Spring Proxy Spring AOP 面向切面编程 Spring与JDBC整合 Spring声明式事务 Spring与Hibernate整合 Spring与Struts整合

    springyuanmaaping.zip

    pring源代码解析1:IOC容器;Spring源代码解析2:IoC...Spring源代码解析6:Spring声明式事务处理 ; Spring源代码解析7:Spring AOP中对拦截器调用的实现 Spring源代码解析8:Spring驱动Hibernate的实现;Spring源代

    spring3.2中文文档

    spring3.2框架是一个轻量级的解决方案和...spring 框架支持声明式事务管理、远程访问 你的逻辑通过RMI或web服务,以及各种选项 坚持你的数据。 它提供了一个功能全面的 MVC框架 ,并允许您 整合 aop 透明地进 你的软件。

    JAVA中spring介绍以及个人使用心得

    事务管理:Spring框架提供了强大的事务管理支持,可以通过编程式事务管理或声明式事务管理来管理应用程序中的事务。 MVC框架:Spring框架提供了一个灵活的MVC框架,可以帮助开发人员构建Web应用程序。该框架支持...

    spring.doc

    5.1.8声明式事务管理 116 5.1.8.1Spring的事务管理器 117 5.1.8.2Spring事务的传播属性 117 5.1.8.3Spring事务的隔离级别 117 拓展: 118 5.1.8.4以XML配置的 形式 119 拓展: 120 5.1.8.5以注解方式配置 125 拓展:...

    spring-framework-4-开发手册.pdf

    Spring Framework 是一个轻...Spring Framework 支 持声明式事务管理,通过 RMI 或 Web 服务远程访问你的逻辑,并支持多种选择持久化你的 数据。它提供了一个全功能的 MVC 框架,使您能够将 AOP 透明地集成到您的软件。

    spring in action英文版

     5.3 声明式事务  5.3.1 理解事务属性  5.3.2 声明一个简单的事务策略  5.4 通过方法名声明事务  5.4.1 使用NameMatchTransactionAttributeSource  5.4.2 名称匹配事务的捷径  5.5 用元数据声明...

    Spring.3.x企业应用开发实战(完整版).part2

    9.6 使用注解配置声明式事务 9.6.1 使用@Transactional注解 9.6.2 通过AspectJ LTW引入事务切面 9.7 集成特定的应用服务器 9.7.1 BEA WebLogic 9.7.2 BEA WebLogic 9.8 小结 第10章 Spring的事务管理难点剖析 10.1 ...

    Spring in Action(第二版 中文高清版).part2

    6.4 声明式事务 6.4.1 定义事务参数 6.4.2 代理事务 6.4.3 在Spring 2.0里声明事务 6.4.4 定义注释驱动事务 6.5 小结 第7章 保护Spring 7.1 Spring Security介绍 7.2 验证用户身份 7.2.1 配置Provider ...

    Spring in Action(第二版 中文高清版).part1

    6.4 声明式事务 6.4.1 定义事务参数 6.4.2 代理事务 6.4.3 在Spring 2.0里声明事务 6.4.4 定义注释驱动事务 6.5 小结 第7章 保护Spring 7.1 Spring Security介绍 7.2 验证用户身份 7.2.1 配置Provider ...

    Spring in Action(第2版)中文版

    6.4声明式事务 6.4.1定义事务参数 6.4.2代理事务 6.4.3在spring2.0里声明事务 6.4.4定义注释驱动事务 6.5小结 第7章保护spring 7.1springsecurity介绍 7.2验证用户身份 7.2.1配置providermanager 7.2.2...

    spring完全学习实例(一)

    主要包括Spring的IoC、AOP(注释注入、Schema注入、与AspectJ的集成、有接口和无接口的实现的界面编程)、中间数据访问层(编程事事务管理、声明式事务管理、与Hibernate的集成、与JDO的集成、与JTA的集成、纯Spring...

Global site tag (gtag.js) - Google Analytics