企业级应用会在一个或多个数据库中存取数据。
这些数据必须是准确的、实时的、可靠的(accurate, current, reliable)
当多个操作同时更新同一条数据时,或者执行一个操作时出现了异常,都可能会导致数据的完整性缺失。
Transaction应运而生。
Transaction会控制多个操作同时访问的情况。
Transaction会在出现异常的时候,执行回滚操作,确保数据处于一致性状态。consistent state。
例:
从账户A转账300到账户B,事务表现为:
begin
账户A减去300
账户B加上300
记录日志
end
三步缺一不可,因此组成一个事务。
事务以begin开始,以commit或rollback结束。发生异常的时候,也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注释。
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会报错。
属性设置示例:
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
原文链接:https://blog.csdn.net/xuefeng0707/article/details/7908589