Transactions

企业级应用会在一个或多个数据库中存取数据。

这些数据必须是准确的、实时的、可靠的(accurate, current, reliable)

当多个操作同时更新同一条数据时,或者执行一个操作时出现了异常,都可能会导致数据的完整性缺失。

Transaction应运而生。

Transaction会控制多个操作同时访问的情况。

Transaction会在出现异常的时候,执行回滚操作,确保数据处于一致性状态。consistent state。

例:

从账户A转账300到账户B,事务表现为:

begin
	账户A减去300
	账户B加上300
	记录日志
end
三步缺一不可,因此组成一个事务。

事务以begin开始,以commitrollback结束。发生异常的时候,也rollback。

rollback时会把此事务已经完成的操作都恢复回去,因此,即使事务失败了,数据还是一致的,完整的。不会出现账户A已经减了300,而账户B却还没有加上。


两种类型:

Container-Managed Transactions

Bean-Managed Transactions

不同类型的事务,边界界定是不一样的形式。


Container-Managed Transactions

容器里的事务,由EJB容器来设定事务的边界。

代码中无需显式的界定事务。

通常,每个EJB方法都是一个事务。方法开始的时候begin,方法结束的时候commit。不允许嵌套的或多个事务。

非必需的,可以通过属性设置。


如果method-A()所处的事务为TX1,那么method-B()所处的事务是什么?

如果method-A()没处在事务中,嘛呢method-B()的事务应是如何的?

可以通过设置method-B()的属性来控制其事务,即给method-B()加上@TransactionAttribute注释。

TransactionAttributemethod-A's Transactionmethod-B's Transaction
RequiredNone
TX1
TX2
TX1
RequiredNewNone
TX1
TX2
TX2
MandatoryNone
TX1
Error
TX1
NotSupportedNone
TX1
None
None
SupportsNone
TX1
None
TX1
NeverNone
TX1
None
Error

TransactionAttribute共有6中属性 : Required, RequiredNew, Mandatory, NotSupported, Supports, Never。

表格中显示: method-B's Transaction 

TX1时,代表B和A处于同一个事务。

TX2时,代表在执行B之前,容器会把TX1挂起,然后开启一个新的事务TX2,执行完B之后,在重启TX1。

None时,代表B不在事务中执行。

Error时,代表此时的设置,由A来调用B会报错。

属性设置示例:

@TransactionAttribute(NOT_SUPPORTED)
@Stateful
public class TransactionBean implements Transaction {
...
    @TransactionAttribute(REQUIRES_NEW)
    public void firstMethod() {...}

    @TransactionAttribute(REQUIRED)
    public void secondMethod() {...}

    public void thirdMethod() {...}

    public void fourthMethod() {...}
}

Rollback Container-Managed Transactions

(1) system exception : 容器会自动rollback。

(2) EJBContext.setRollbackOnly()。

(3) application exception : 容器不会自动rollback,可通过调用setRollbackOnly()执行rollback。

Container-Managed Transaction中不允许调用的方法:

(1) java.sql.Connection : commit(), rollback(), setAutoCommit()

(2) javax.ejb.EJBContext : getUserTransaction()

(3) javax.transaction.UserTransaction : 所有方法。


Bean-Managed Transactions

Container-Managed Transaction 可以简化代码,但是有其限制: 一个方法要么在一个事务中,要么不在事务中。不能自定义事务。

Bean-Managed Transaction 需要显示的设定事务的开始、结束或回滚,容易控制。

也可称为Application-Managed Transactions

(1) JDBC Transactions

(2) JTA Transactions


关于JDBC和JTA,会在下篇文章中说到。


Link : http://docs.oracle.com/cd/E19798-01/821-1841/6nmq2cpn2/index.html


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值