- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的问题与事务和异常有关
要求:
我有 10 条记录要插入到数据库表中。在插入每条记录后,我将数据插入到另一个表中。因此,如果插入第二个表失败,我想回滚该记录。
例。假设一次处理 10 个人的现金转账(从一个账户到另一个账户)。
伪代码:-------------- EJB方法的开始
for(int i = 0; i < TransferRecords.length; i++)
{
try
{
//Deduct cash from TransferRecord.accountFrom --- Includes use of Hibernate Session
//Add cash in TransferRecord.accountTo -- Includes use of Hibernate Session
} catch(AppException exception)
{
//Rollback the transaction only for this particular transfer (i)
// But here when I go for next record it says session is closed
}
}
------------EJB方法结束
此处 AppException 是使用 @ApplicaitonException(rollback=true) 注释创建的。
我们想要的功能是:即使 TransferRecord(比如 2)的事务失败,我也希望为记录 0、记录 1、记录 3、记录 4(等...但不为记录提交数据2)
但这里的问题是:当 TransferRecord 2 失败并且当我移动到 TransferRecord 3 时,我收到“ session 已关闭”错误。
我的疑惑是:1. 这是正确的做法吗?或者我应该在 EJB 之外运行 for 循环(针对每个 TransferRecord)2. 如何确保 session 未关闭但事务已回滚(仅针对特定失败的事务)
提前谢谢你。
我正在使用 EJB3、Hibernate 3.x、Jboss 4.2.x 并且我正在使用容器管理事务。
最佳答案
Is this a right approach?
不,对于 CMT,您的方法就是您的交易单位。所以在这里,您所有的 TransferRecord
都在同一笔交易中处理。
顺便问一下,如何回滚事务?您是传播 RuntimeException
还是调用 setRollbackOnly()
?我只是好奇。
Or should I run the for loop (for each TransferRecord) outside of the EJB?
为什么在外面?没有什么会强制你那样做。如果您想在自己的事务中处理每个 TransferRecord
,您应该将它们传递给另一个 EJB 方法(下面的代码受 this answer 启发):
// supposing processRecords is defined on MyStatelessRemote1 and process defined on MyStatelessLocal1
@Stateless
@TransationAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class MyStatelessBean1 implements MyStatelessLocal1, MyStatelessRemote1 {
@EJB
private MyStatelessLocal1 myBean;
public void processRecords(List<TransferRecord> objs) {
// No transactional stuff so no need for a transaction here
for(Object obj : objs) {
this.myBean.process(obj);
}
}
@TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
public void process(TransferRecord transferRecord) {
// Transactional stuff performed in its own transaction
// ...
}
}
How can I make sure that session is not closed but transaction is rolled back (only for that for particular failed transaction)
我想我已经涵盖了那部分。
关于java - ApplicationException - Java - Hibernate - 回滚相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2029438/
我是一名优秀的程序员,十分优秀!