TransactionManagementType.CONTAINER 与 TransactionManagementType.BEAN

Mad*_*ist 7 transactionmanager spring-transactions ejb-3.0 spring-mybatis

TransactionManagementType.CONTAINER 和 TransactionManagementType.BEAN 有什么区别

因为我在我所有的 EJB 中使用 TransactionManagementType.CONTAINER 并且当使用多个数据库实例时,它会抛出一个错误,如果我将其更改为 TransactionManagementType.BEAN

我想知道如果我将其更改为 TransactionManagementType.BEAN 有什么优点和缺点以及如何影响它

ERROR:
Error updating database.  Cause: java.sql.SQLException: javax.resource.ResourceException: 
IJ000457: Unchecked throwable in managedConnectionReconnected() cl=org.jboss.jca.core.
connectionmanager.listener.TxConnectionListener@680f2be0[state=NORMAL managed 
connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@7ba33a94 connection 
handles=0 lastReturned=1495691675021 lastValidated=1495690817487 
lastCheckedOut=1495691675018 trackByTx=false pool=org.jboss.jca.core.connectionmanager.
pool.strategy.OnePool@efd42c4 mcp=SemaphoreConcurrentLinkedQueueManagedConnectionPool
@71656eec[pool=FAQuery] xaResource=LocalXAResourceImpl@4c786e85
[connectionListener=680f2be0 connectionManager=5c3b98bc warned=false 
currentXid=null productName=Oracle productVersion=Oracle Database 12c 
Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
jndiName=java:/FAQuery] txSync=null]
Run Code Online (Sandbox Code Playgroud)

fg7*_*8nc 4

事务管理类型.CONTAINER

您让容器本身管理事务(容器将提交和回滚)。您可以通过使用TransactionAttribute Types@TransactionManagementAttribute注释方法并指定其中一个属性来控制事务的行为(更准确地说是事务传播)。

事务管理类型.BEAN

您必须通过获取UserTransaction接口自己显式地进行事务划分(启动、提交、回滚)。

@Resource
UserTransaction ut;

public void method(){
   ut.begin();
... // your business logic here
   ut.commit(); // or ut.rollback();
}
Run Code Online (Sandbox Code Playgroud)

请注意,在退出声明无状态和消息驱动 Bean 事务的相同方法之前,必须提交和回滚,但有状态 Bean 则不需要。

关于你的问题,BMT的优点是事务的范围可以小于方法本身的范围,即对事务的显式控制。您很可能会使用 CMT,只有在某些狭窄的极端情况下才需要 BMT 来支持特定的业务逻辑。BMT 的另一个优点或用例是,如果您需要使用扩展持久性上下文类型,则可以通过状态会话 Bean 在 BMT 中支持该类型。