为什么不提交 Requires_New 的事务?
Why does not commit transaction of Requires_New?
我正在使用 EJB 3.0
开发 SAP java 应用服务器
我要数据库一一插入。因为我的数据太多了,要分数据。所以我尝试了测试代码,它确实有效,但它没有按我想要的那样工作。
我想为每个部分创建一个新事务,当然最后方法(事务)应该提交。
示例代码如下;
package com.transaction.jobs;
import javax.ejb.Local;
/**
*
* @author muratdemir
*/
@Local
public interface TestTransactionLocal {
public void onStart();
public void insertObject(int i);
}
和
package com.transaction.jobs;
import com.transaction.service.DatabaseServiceLocal;
import com.transaction.entity.Item;
import com.transaction.entity.Logger;
import java.util.Date;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
/**
*
* @author muratdemir
*/
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class TestTransactionService implements TestTransactionLocal {
@EJB
DatabaseServiceLocal databaseService;
@Resource
EJBContext context;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void onStart() {
try {
System.out.println("START");
Logger log1 = new Logger(new Date(), ">>>T1 commiting");
databaseService.create(log1);
System.out.println(">>>T1 committing");
Thread.sleep(5000);
for (int i = 1; i < 10; i++) {
System.out.println("Call new Transaction");
insertObject(i);
Thread.sleep(2000);
}
Thread.sleep(5000);
Logger log2 = new Logger(new Date(), "<<<T1 commiting");
databaseService.create(log2);
System.out.println("<<<T1 committing");
Thread.sleep(5000);
System.out.println("END");
} catch (Exception e) {
e.printStackTrace();
context.setRollbackOnly();
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void insertObject(int i) {
try {
System.out.println("New Transaction Start i:" + i);
Item item = new Item(new Date(), "Name_" + i);
databaseService.create(item);
System.out.println("commit transaction: " + i);
} catch (Exception e) {
e.printStackTrace();
context.setRollbackOnly();
}
}
}
insertObject(Requires_New) 函数正在运行,但未提交。它等待提交其他 onStart(REQUIRED) 函数。如果 mytimer 函数结束,插入函数将全部提交。
为什么没有提交新事务?
注意: 如果我将 onStart 函数的交易属性 REQUIRED 更改为 NOT_SUPPORTED,它会按我的意愿工作。为什么会这样?
您正在直接调用 prepare()
方法,因此不考虑事务注释。您需要通过它自己的界面调用它,即 myTestTimerLocal.prepare()
,以实现任何交易效果。
您必须使用 SessionContext#getBusinessObject 方法初始化另一个 TestTransactionLocal。这样您的 TestTransactionLocal 实例将遵守@TransactionAttribute 注释。
@Resource
private SessionContext sessionContext;
private TestTransactionLocal local;
@PostConstruct
void init() {
local = sessionContext.getBusinessObject(TestTransactionLocal.class);
}
然后通过这个新引用调用 insertObject():
local.insertObject(i);
查看此博客 post:http://www.adam-bien.com/roller/abien/entry/how_to_self_invoke_ejb
我正在使用 EJB 3.0
开发 SAP java 应用服务器我要数据库一一插入。因为我的数据太多了,要分数据。所以我尝试了测试代码,它确实有效,但它没有按我想要的那样工作。
我想为每个部分创建一个新事务,当然最后方法(事务)应该提交。
示例代码如下;
package com.transaction.jobs;
import javax.ejb.Local;
/**
*
* @author muratdemir
*/
@Local
public interface TestTransactionLocal {
public void onStart();
public void insertObject(int i);
}
和
package com.transaction.jobs;
import com.transaction.service.DatabaseServiceLocal;
import com.transaction.entity.Item;
import com.transaction.entity.Logger;
import java.util.Date;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
/**
*
* @author muratdemir
*/
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class TestTransactionService implements TestTransactionLocal {
@EJB
DatabaseServiceLocal databaseService;
@Resource
EJBContext context;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void onStart() {
try {
System.out.println("START");
Logger log1 = new Logger(new Date(), ">>>T1 commiting");
databaseService.create(log1);
System.out.println(">>>T1 committing");
Thread.sleep(5000);
for (int i = 1; i < 10; i++) {
System.out.println("Call new Transaction");
insertObject(i);
Thread.sleep(2000);
}
Thread.sleep(5000);
Logger log2 = new Logger(new Date(), "<<<T1 commiting");
databaseService.create(log2);
System.out.println("<<<T1 committing");
Thread.sleep(5000);
System.out.println("END");
} catch (Exception e) {
e.printStackTrace();
context.setRollbackOnly();
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void insertObject(int i) {
try {
System.out.println("New Transaction Start i:" + i);
Item item = new Item(new Date(), "Name_" + i);
databaseService.create(item);
System.out.println("commit transaction: " + i);
} catch (Exception e) {
e.printStackTrace();
context.setRollbackOnly();
}
}
}
insertObject(Requires_New) 函数正在运行,但未提交。它等待提交其他 onStart(REQUIRED) 函数。如果 mytimer 函数结束,插入函数将全部提交。
为什么没有提交新事务?
注意: 如果我将 onStart 函数的交易属性 REQUIRED 更改为 NOT_SUPPORTED,它会按我的意愿工作。为什么会这样?
您正在直接调用 prepare()
方法,因此不考虑事务注释。您需要通过它自己的界面调用它,即 myTestTimerLocal.prepare()
,以实现任何交易效果。
您必须使用 SessionContext#getBusinessObject 方法初始化另一个 TestTransactionLocal。这样您的 TestTransactionLocal 实例将遵守@TransactionAttribute 注释。
@Resource
private SessionContext sessionContext;
private TestTransactionLocal local;
@PostConstruct
void init() {
local = sessionContext.getBusinessObject(TestTransactionLocal.class);
}
然后通过这个新引用调用 insertObject():
local.insertObject(i);
查看此博客 post:http://www.adam-bien.com/roller/abien/entry/how_to_self_invoke_ejb