gpt4 book ai didi

java - ApplicationException - Java - Hibernate - 回滚相关

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:17 29 4
gpt4 key购买 nike

我的问题与事务和异常有关

要求:

我有 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com