簡體   English   中英

為什么不提交 Requires_New 的事務?

[英]Why does not commit transaction of Requires_New?

我正在使用 EJB 3.0 開發 SAP java 應用程序服務器

我想一一插入數據庫。 因為我有太多的數據,我不得不分割數據。 所以我做了 try 測試代碼,它確實有效,但它並沒有像我想要的那樣工作。

我想為每個部分創建一個新事務,當然最后方法(事務)應該提交。

示例代碼如下;

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);

請參閱此博客文章: http : //www.adam-bien.com/roller/abien/entry/how_to_self_invoke_ejb

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM