EJB原理之(六)--范例--一个简单的事务容器

范例代码,可以下载参考:

http://download1.csdn.net/down3/20070613/13195846536.rar

事务的类型有很多中,在EJB体系中有七种事务类型,很多的资料都进行过比较详尽的介绍,由于以介绍原理为目的,这里主要针对事务容器中最常见的两种事务类型
最常见的事务有两种类型:Required和Required New
“Requied”事务类型指当前的事务环境之前如果已经存在事务环境,就将当前的事务环境跟随到已存在的事务环境中,如果之前不存在事务环境,那么就启动一个新的事务环境,如果在这个事务环境中任何一点回滚,那么整个的事务环境都进行回滚。
“Required New”事务类型指不管当前事务环境之前是否存在事务环境,都需要建立一个新的事务环境,当自己的事务处理结束的时候就直接提交,外部的事务回滚不影响现在的事务。
以上面发帖的功能为例,我们这里实现一个简单的事务控制方法对事务进行统一处理,在纯SQL的环境中,事务控制代码是重复的,SQL语句也是重复的,但是从整个系统的结构来说,这些重复的部分都应该进行封装重用。
在发帖功能中,一共有以下几个部分:
1) 新增一个用户
2) 这个用户发一篇文章
3) 这个用户再给自己的这篇文章写一个回复
4) 在发文章和回复的时候给用户加分
5) 在进行任何一个操作时,都记录一个日志

如果以重用的方式进行设计,那么满足这些功能需要以下几个独立的方法:
1) addUser()//增加一个用户
2) addArticle()//增加一篇文章
3) addComment()//增加一个回复
4) addPoint()//增加分数
5) log()//记录日志
在纯SQL的环境中,addPoint方法是无法实现的,因为addPoint方法需要被addArticle和addComment方法重复调用,但是由于无法统一的管理事务,addPoint中的SQL语句都被分散到了addArticle和addComment方法中,所以在一个简单的事务控制范例中,主要解决通过解决addPoint方法的重用问题来实现简单的事务控制方法,当addPoint方法被addArticle调用的时候,就跟随addArticle的事务,如果被addComment调用的时候,就跟随addComment的事务。
Log方法的使用是为了演示另外一个事务类型Required New,因为作为日志,不管外面的环境成功或者失败,这里都是一个独立的过程,都需要记录一定的信息。
这里以addArticle为例,说明几个事务之间的关系

  在整个过程中,一共会有三个事务启动,“增加文章”和“用户加分”两个功能必须同时成功,所以这两个方法应该属于同一个事务环境,“写日志”功能因为和任何环境都无关,不管外界是否成功,日志总是需要独立写入的,所以“写日志”方法每一次启动都会有一个新的事务与之对应。
○1 ~○10之间是一个完整的事务环境,从○1开始,到○10结束,“增加文章”和“用户加分”因为都需要同一个事务环境,那么就选择了跟随当前环境,从EJB事务控制的角度来看,就属于“Required”事务类型,“写日志”方法由于每一次都需要新的事务环境,那么在○4,○8两处,“写日志”方法又启动了两个新的事务环境,并在○5,○9处进行了关闭。
这里有一个简单事务容器的例子,实现较为简单,很多复杂的东西都没有包含,主要是为了实现一个基本的事务容器。
在整个的事务容器中,并没有加入一些新的东西,一切都以JDBC作为基础进行了实施。所有的处理到最终都是被转化为了JDBC的基本操作模式进行执行。在简单的事务容器中,由于暂时不考虑分布式事务,所以就直接使用了java.sql.Connection中的事务控制方法进行了事务的控制,如果需要使用分布式事务,那么在这个事务控制的环节就需要引入JTA进行分布式事务的控制,但是基本的框架不会发生改变,下面是这个简单事务容器的基本结构。

 

这其中主要的部分是container部分,这一部分实现了基本的容器功能,Context是一个事务环境,用来管理事务的环境,ContextElement是事务环境中的元素,其实ContextElement的结构很简单,主要是将java.sql.Connection和java.sql.Statement两个类封装在了其中。
从前面用JDBC实现的例子来看,基本的事务处理只有几行代码:

 

在这些代码里,所有的事务由Connnection对象进行控制,所有的SQL代码都由Statement对象进行执行,所以如果需要控制事务,就控制这两个对象即可。
在这个简单的事务容器中,一共为两个部分,ContextElement封装了Connectiond对象和Statement对象,负责执行SQL语句并保证事务完整,Context对象负责根据调用者的实际情况选择相对应的ContextElement执行语句。
 事务容器的使用会有两个过程,
1) 初始化过程
2) 事务执行过程
初始化过程主要负责事务容器的初始化工作,如建立必要连接,进行环境的准备等,简单的初始化过程如下:


 
容器的初始化一般都在UserApplication初始化的时候进行一次性初始化,以后的操作基本不需要再进行初始化。
容器初始化之后就可以进行事务的操作,事务的操作包括三个步骤
1) 启动事务环境
2) 执行SQL语句
3) 关闭事务环境

 
为了可以使不同方法之间的事务可以协同工作,在Context中建立了一个堆栈,当Context初始化时,堆栈中至少放置一个ContextElement对象,这个对象就是根事务对象,UserApplication开

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值