2015-04-07 50 views
2

我有一个问题。我正在使用java应用程序服务器(sap netweaver)与我正在使用ejb 3.0为什么不提交Requires_New事务?

所以我想数据库一个接一个地插入。因为我的数据太多,我不得不分数据。所以我做了一个测试代码,它确实有效,但它并没有像我想的那样工作。

我想为每个部分创建一个新的事务,当然在最后方法(事务)应该是提交。

示例代码如下;

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,它的工作原理是我想要的。为什么它以这种方式工作?

回答

2

您必须使用SessionContext#getBusinessObject方法初始化另一个TestTransactionLocal。这样你的TestTransactionLocal实例将遵循@TransactionAttribute注解。

@Resource 
private SessionContext sessionContext; 

private TestTransactionLocal local; 

@PostConstruct 
void init() { 
    local = sessionContext.getBusinessObject(TestTransactionLocal.class); 
} 

然后通过这个新的参考调用insertObject():

local.insertObject(i); 

看到这个博客帖子:http://www.adam-bien.com/roller/abien/entry/how_to_self_invoke_ejb

+0

是的,它的工作! –

2

您直接调用prepare()方法,因此不考虑事务注释。您需要通过自己的界面(即myTestTimerLocal.prepare())调用它,以获得任何交易影响。

+0

我更新的问题。我试过'@EJB TestTransactionLocal local; '和'local.insertObject(i);'但没有奏效。 –

相关问题