文档章节

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

小贱1991
 小贱1991
发布于 2016/07/29 10:31
字数 1149
阅读 93
收藏 1

行业解决方案、产品招募中!想赚钱就来传!>>>

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

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

PHP培训

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();

 }

 }

 });

 }

 }

小贱1991
粉丝 1
博文 24
码字总数 25924
作品 0
昌平
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
5.9K
18
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
代码生成器--Codgen

Codgen是一个基于数据库元数据模型,使用freemarker模板引擎来构建输出的代码生成器。freemarker的数据模型结构通常来说都是一个Map树状结构模型,codgen也不例外,它的数据模型这棵树的根节...

黄天政
2013/01/29
1.4W
2
JavaScript 服务器页--JSSP

JSSP (JavaScript Server Pages) 可以让你在 Java 的应用服务器上使用 JavaScript 生成网页。支持已有的 Java 包和嵌入式 SQL 命令。包含 Dervish 这个 JavaScript 交互操作包用于简化 Ajax...

匿名
2013/02/11
3.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

揭秘神秘的MarxDB

主题:MarxDB金融级分布式数据库 大纲: 1、石老师好像是第一次来3306π,可以先重点自我介绍一下。 2、石老师可以简单介绍一下MarxDB的情况吗? 3、跟传统的关系型数据库相比,MarxDB有什么...

叶金荣
昨天
0
0
ASP.NET Core搭建多层网站架构【13-扩展之支持全球化和本地化多语言】

2020/02/03, ASP.NET Core 3.1, VS2019, ResXManager 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构【13-扩展之支持全球化和本地化多语言】 使用资源管理多语言文件实现网站本地化...

osc_wip0vvls
21分钟前
9
0
浙江移动正式采用蚂蚁集团自研数据库OceanBase

近日,浙江移动正式引入蚂蚁集团的自研数据库OceanBase,首期应用于其政企网格智慧运营系统,这也是OceanBase首次落地于运营商场景。 政企网格智慧运营平台是浙江移动针对政企用户推出的服务...

支付宝技术
昨天
9
0
使用Charles代理功能将网络请求定向至本地文件

  最近在进行前端开发的时候发现Charles一个非常牛叉的功能,就是可以通过代理将网络请求定向至本地文件。有了这个功能在进行iOS开发时就可以在缺少后台接口的情况下更加真实的进行数据moc...

osc_qvtw8r10
22分钟前
7
0
多边形裁剪图片升级啦!Cocos Creator !

支持合图,支持gizmo添加节点和调整位置,支持缩放旋转。文章底部获取完整项目! 效果预览与使用 原理 回顾 在gizmo入门探索介绍了 gizmo 与多边形裁剪的配合。 在使用 mesh 实现多边形裁剪图...

白玉无冰
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部