gpt4 book ai didi

java - 在回滚过程中启动新事务

转载 作者:行者123 更新时间:2023-12-01 15:57:35 26 4
gpt4 key购买 nike

我使用的是Jboss5.1.x EJB3.0

我正在尝试在回滚过程中打开新事务以写入数据库。

我唯一能做的就是t,是当我将事务包装在一个单独的线程中时,这对我来说似乎不正确。它可能会导致任何问题吗?这样做的意义是什么(用新线程包装),它应该可以在没有它的情况下工作,不是吗?

代码:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void updateCurrentRetryInDB(final CounterCallData counterCall)
{
Thread t = new Thread()
{
@Override
public void run()
{
try
{
ECMSDao.insertErrorToLog(counterCall.getModemIp(), "Time out");
} catch (SQLException e)
{
System.out.println("SQL Exception:" + e.getMessage());
logger.error(TAG + ".updateCurrentRetryInDB, SQLException Error", e);
}
}
};
t.start();
}

谢谢,射线。

最佳答案

我有和你一样的需求,在回滚过程中在数据库中写入一些内容。

我所做的是创建一个新的有状态 EJB,它具有 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 并调用存储在数据库中的保存方法。

我没有创建新线程或任何东西,因为这应该由容器处理。

因此,在您的情况下,我猜 ECMSDao 应该是一个带有 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)@Stateful ejb,而不是方法updateCurrentRetryInDB()

更新

假设您有一个正常情况,正在存储某些内容,然后发生回滚。在此示例中,我使用托管事务进行模拟。

public class Foo {

@PersistenceContext EntityManager em;

@Inject BarImpl bar; //can also use @EJB depending on your environment

public void fail() {
try {
//do some thing and throw exception to simulate rollback
throw new RuntimeException("Exception occured, please rollback");
} catch(Exception ex) {
bar.save(ex.getMessage()); // <-- This will store the exception message in a new transaction whilst the other transaction is safely rolledback
throw ex;
}
}

@Scope(SESSION)
@Stateful
@TransactionManagement(TransactionManagementType.CONTAINER) //default
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class BarImpl implements Bar {

@PersistenceContext EntityManager em;
@Destroy @Remove public void destroy(){}

public void save(String msg) {
MyEntity m = new MyEntity();
m.setMessage(msg);
em.persist(m);
}

}

关于java - 在回滚过程中启动新事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4803322/

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