`
itxdl
  • 浏览: 26869 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java学习-编程式的事务管理

阅读更多
Java学习-编程式的事务管理
编程式事务提供了TransactionTemplate 模板类,该类可以大大减少事务操作的代码。因此TransactionTemplate 采用Callback 避免让开发者重复书写其打开事务、提交事务及回滚事务等代码,同时TransactionTemplate 无须书写大量的try..catch 块。

HibernateTemplate 必须提供PlatformTransactionManager 实例。该实例既可以在代码中手动设置,也可以使用Spring 的依赖注入。总之,只要获取了PlatformTransactionManager 引用, TransactionTemplate 就可以完成事务操作。

使用TransactionTemplate 不需要显式地开始事务,甚至不需要显式地提交事务。这些步骤都由模板完成。但出现异常时,应通过TransactionStatus 的setRollbackOnly 显式回滚事务。
TransactionTemplate 的execute 方法接收一个TransactionCallback 实例。Callback 也是Spring 的经典设计,用于简化用户操作,下面兄弟连www.lampbrother.net 就帮大家总结了一些TransactionCallback 包含的方法:如下。

• Object dolnTransaction(TransactionStatus status) 。
该方法的方法体就是事务的执行体。
如果事务的执行体没有返回值,则可以使用TransactionCallbackWithoutResultl类的实例。这是个抽象类,不能直接实例化,只能用于创建匿名内部类。它也是TransactionCallback 接口的子接口,该抽象类包含一个抽象方法:
• void dolnTransactionWithoutResult(TransactionStatus status)该方法与dolnTransaction 的效果非常相似,区别在于该方法没有返回值,即事务执行体无须返回值。
在下面的示例中, PlatformTransactionManager 实例采用适用于Hibernate 的事务管理器来实现类HibernateTransactionManager,该实现类是个局部事务管理器,容器中仅仅部署了该事务管理器bean ,因此应在代码中于动为TransactionTemplate 注入事务管理器bean。下面是Hibernate 局部事务管理的配置文件的源代码:
<?xml version="1.0" encoding="gb2312"?>
<! -- Spring 配置文件的DTD 定义-->
<!DOCTYPE beans PUBL工C "-//SPRING//DTD BEAN//EN"
''http://www.springfrarnework.org/dtd/sp工rng-beans.dtd">
<!-- Spring 配置文件的根元素是beans-->
<beans>
<!--定义数据源,该bean 的ID 为dataSource-→
<bean id="dataSource" class="org.springfrarnework.jdbc.datasource.DriverManagerDataSource">
<!-- 指定数据库驱动-->
<property narne="driverClassNarne"><value>corn.rnysql.jdbc.Driver</value></property>
<!-- 指定连接数据库的URL-->
<property narne="url"><value>jdbc:rnysql://wonder:3306/j2ee</value></property>
<!--root 为数据库的用户名-->
<property name="username"><value>root</value></property>
<!-- pass 为数据库密码-->
<property name="password"><value>pass</value></property>
</bean>
<!--定义Hibernate 的SessionFactory-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!--依赖注入数据源,注入上文定义的dataSource-->
<property name="dataSource"><ref local="dataSource"/></property>
<!--mappingResouces属性用来列出全部映射文件>
<property name="mappingResources">
<list>
<!--以下用来列出所有的PO 映射文件-->
<value>lee/MyTest.hbm.xml</value>
</list>
</property>
<!--定义Hibernate 的SessionFactory的属性-->
<property name="hibernateProperties">
<props>
<!-- 指定Hibernate 的连接方法-->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<! 不同数据库连接,启动时选择create , update , create-drop-->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!--配置Hibernate 的事务管理器一〉
<!--使用HibernateTransactionManager类,该类是PlatformTransactionManager 接口针对采用Hibernate持久化连接的特定实现。-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!--HibernateTransactionManager bean 需要依赖注入一个SessionFactory bean 的引用-->
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
</beans>

下面是采用TransactionTemplate和HibemateTemplate的事务操作代码:
public class TransactionTest
{
public static void main(String[] args)
{
//因为并未在web 应用中测试,故需要手动创建Spring 的上下文
final ApplicationContext ctx = new FileSystemXrnlApplicationContext("bean.xml");
//获得Spring 上下文的事务管理器
PlatformTransactionManager transactionManager=(PlatformTransactionManager)ctx.getBean("transactionManager");
final SessionFactory sessionFactory = (SessionFactory)ctx.getBean("sessionFactory");
//以事务管理器实例为参数,创建TransactionTemplate对象
TransactionTemplate tt = new TransactionTemplate(transactionManager);
//设置TransactionTemplate的事务传播属性
tt. setPropagationBehavior (TransactionDefinition.PROPAGATION_REQUlRED);
//执行TransactionTemplate的execute方法,该方法需要TransactionCallback实例
tt.execute(new TransactionCallbackWithoutResult()
//采用TransactionCallbackWithoutResult匿名内部类的形式执行
protectedvoid dolnTransactionWithoutResult(TransactionStatus ts)
try
{
//以SessionFactory 实例为参数创建HibernateTemplate
HibernateTemplate hibernateTemplate =
new HibernateTemplate(sessionFactory);
MyTestpl =丑ew MyTest ("Jack");
//保存第一个实例
hibernateTemplate.save(pl);
//让下面的数据库操作抛出异常即可看出事务效果。前面的操作也
//不会生效
MyTestp2 = new MyTest ("Jack");
//保存第二个实例,可将Person 的name 属性设为标识属性,并
//引起主键重复的异常,可看出前一条记录也不会加入数据库中
hibernateTemplate.save(p2);
}
catch (Exception e)
{
ts.setRollbackOnly();
}
}
});
}
}
分享到:
评论

相关推荐

    spring学习笔记(十五)-编程式事务例子

    在本篇“Spring学习笔记(十五)——编程式事务例子”中,我们将深入探讨Spring框架中的编程式事务管理。在实际开发中,我们通常使用声明式事务管理,它基于AOP(面向切面编程)来简化事务处理。然而,有时为了更细...

    spring学习之八--Hibernate编程式事务

    在本篇"Spring学习之八--Hibernate编程式事务"中,我们将探讨如何在Spring框架中使用Hibernate进行编程式事务管理。编程式事务管理是相对于声明式事务管理的一种方式,它允许开发者通过代码来显式控制事务的开始、...

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

    本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...

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

    在Java开发领域,Spring框架是不可或缺的重要组成部分,尤其在企业级应用中,它提供了丰富的功能,包括但不限于依赖注入、AOP(面向切面编程)以及事务管理。本篇文章将深入探讨Spring中的两种主要事务管理方式:...

    09-4编程式事务管理.rar

    Spring框架提供了两种主要的事务管理方式:声明式事务管理和编程式事务管理。本资料着重于“编程式事务管理”,这是一种通过代码直接控制事务开始、提交、回滚等操作的方式。 在Spring中,编程式事务管理通常使用...

    spring编程式事务实现

    Spring提供了两种主要的事务管理方式:声明式事务管理和编程式事务管理。本篇文章将聚焦于编程式事务管理,特别是如何通过`TransactionTemplate`进行事务控制。 1. **Spring编程式事务管理**: 编程式事务管理允许...

    spring_tx编程式事务代码

    Spring提供了多种事务管理方式,其中编程式事务管理和声明式事务管理是两种主要的模式。编程式事务管理允许开发者通过代码来精确控制事务的边界,而`TransactionTemplate`就是Spring为编程式事务管理提供的一种便捷...

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

    在Java应用中,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 **编程式事务管理** 是通过调用`PlatformTransactionManager`接口提供的方法来手动控制事务的开始、提交、回滚。例如,你...

    基于java的-178-ssm班级事务管理系统-源码.zip

    在寻求Java编程的学习材料或解决开发中的实际问题时,一份高质量的Java源码资源无疑是最为宝贵的。我所提供的Java源码资源,正是为了满足广大Java学习者、大学生、开发人员等群体的切实需求而精心整理的。 可用性...

    spring框架的学习--事务

    在Spring框架中,事务管理分为编程式事务管理和声明式事务管理两种方式。 1. **编程式事务管理**:通过使用PlatformTransactionManager接口和TransactionDefinition接口,开发者可以直接在代码中控制事务的开始、...

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

    ### Spring的编程式事务管理与声明式事务管理详解 #### 引言 Spring框架作为Java企业级开发的首选,其事务管理模块是实现业务逻辑可靠性和数据一致性的重要组成部分。Spring支持两种事务管理方式:编程式事务管理...

    java事务 - 使用注解

    在Java编程中,事务管理是确保数据库操作一致性的重要机制。当涉及到多个数据库操作时,事务可以确保这些操作要么全部成功,要么全部失败,避免数据不一致的情况。在Spring框架中,我们可以利用注解来简化事务的管理...

    Spring学习笔记之九--声明式事务

    编程式事务管理需要开发者显式地调用begin、commit、rollback等方法来控制事务,而声明式事务管理则更加便捷,它允许开发者通过配置或注解来声明事务的边界,使得事务管理与业务逻辑分离。 声明式事务主要依赖于...

    butte-java-note-编程文档

    在“butte-java-note-编程文档”中,我们可以探索一系列丰富的IT知识点,涵盖了从基础到高级的Java编程、软件设计、系统架构以及大数据处理等多个领域。以下是对这些知识点的详细阐述: 1. **JVM(Java虚拟机)**:...

    JAVA实战项目源码-计算机毕业设计java专业-项目源码-项目说明介绍-java-sql-图书管理系统

    JAVA实战项目源码-计算机毕业设计java专业-项目源码-项目说明介绍-java-sql-图书管理系统 图书馆管理系统是图书馆管理工作中不可缺少的部分,它对于图书馆的管理者和使用者都非常重要,所以图书馆管理系统应该为...

    详解Spring学习之编程式事务管理

    详解Spring学习之编程式事务管理 Spring框架中提供了两种事务管理方式:编程式事务管理和声明式事务管理。在本篇文章中,我们主要介绍编程式事务管理。 什么是编程式事务管理? 编程式事务管理是指通过编写代码...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring AOP的声明式事务。 首先,让我们理解Spring与Hibernate的集成。为了整合这两个库,你需要在Spring配置文件中定义Hibernate的...

    java事务设计策略

    - **编程式事务管理**:开发者需要在代码中显式地管理事务,通常用于复杂的业务逻辑。 - **声明式事务管理**:通过配置文件或注解的方式指定事务边界,简化了事务管理的复杂度。 - **混合事务管理**:结合编程式和...

Global site tag (gtag.js) - Google Analytics