Plant Operations允许使用UserTransaction对象将多个原子事务作为单个组的一部分执行。 分组的事务将包含各个事务的所有特征。 使用以下方法执行分组事务:
- UserTransaction.begin()
- UserTransaction.commit()
- UserTransaction.rollback()
使用UserTransaction.commit()方法时,begin()和commit()之间完成的所有单个事务将作为一个事务保存到数据库中。 如果无法保存一个分组事务,则不会保存任何单个事务。
使用UserTransaction.rollback()方法时,begin()和rollback()之间完成的所有单个事务将作为一个事务回滚。
使用UserTransaction.setTransactionTimeout(interval)方法设置事务分组超时。 间隔以秒为单位。 必须在调用transaction.begin()方法之前设置事务分组超时。 如果在调用transaction.begin()方法之前未设置它,则setTransactionTimeout(interval)方法无法生效。
//创建UserTransaction对象
response = getUserTransaction()
objTrx = response.getResult()
//设置事务超时,单位秒
objTrx.setTransactionTimeout(3000)
//开始然后保存交易
objTrx.begin()
...
LotA.save()
LotB.save()
Unit.close("reason")
...
objTrx.commit()
您可以组合在一起的交易数量没有限制。 此功能记录组中每个成员的实际事务时间,这与分组的事务时间不同。
嵌套事务组
可以选择使用Function.getUserTransaction(boolean allowNesting)方法启用嵌套。 例如,Function1调用Function2,然后调用Function3。 当Function2调用UserTransaction.begin()时,会发生以下情况,具体取决于您的allowNesting配置:
- 如果allowNesting设置为false,则UserTransaction.begin()调用将失败,因为Function1已经调用了UserTransaction.begin()。
- 如果allowNesting设置为true,则每次调用嵌套函数时,beginCount值都会递增。 因此,当Function1调用UserTransaction.begin()方法时,该值增加到1,然后当Function2调用UserTransaction.begin()方法时,该值增加到2。
如果allownest设置为true,还会发生以下行为:
- 调用UserTransaction.commit()方法时,会为每个嵌套函数递减beginCount值,直到beginCount值为0.然后提交事务。
- 调用UserTransaction.rollback()方法时,会为每个嵌套函数递减beginCount值,直到beginCount值为0.然后回滚事务。 一旦在嵌套函数上调用UserTransaction.rollback()方法,尝试在任何其他嵌套函数上执行任何其他事务将返回错误。 只能在其他嵌套函数上调用UserTransaction.rollback()方法。
调用UserTransaction.getBeginCount()方法以返回当前启动的嵌套函数的数量。
事务组支持
以下支持事务分组:
-
WebSphere (clustering and non-clustering environment)
-
JBoss Advanced (clustering and non-clustering environment)
-
JBoss Stand-Alone
-
a Java Web Services client when using RMI
-
all supported security providers
使用.NET代理工厂或使用SOAP协议的任何客户端时,不支持此功能。 事务分组不支持子事务(即嵌套事务)。
FTPC不会在数据库中创建事务分组的记录。