Почему не фиксирует транзакцию require_New?

У меня проблема. Я работаю на сервере приложений Java (SAP Netweaver) с я использую EJB 3.0

Поэтому я хочу вставить базу данных одну за другой. Потому что у меня слишком много данных, и я должен разделить данные. Поэтому я попытался протестировать код, и он работал, но он не работал так, как я хочу.

Я хочу создать новую транзакцию для каждой части и, конечно, в конце метод (транзакция) должен быть зафиксирован.

Пример кода ниже;

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 (require_New) работает, но не зафиксировала. Он ожидает фиксации другой функции onStart(REQUIRED). Если функция mytimer завершена, функция вставки выполняет весь коммит.

Почему новая транзакция не совершена?

Примечание. Если я изменю атрибут транзакции функции onStart REQUIRED на NOT_SUPPORTED, он будет работать так, как я хочу. Почему так работает?

2 ответа

Решение

Вы должны инициализировать другой TestTransactionLocal с использованием метода SessionContext#getBusinessObject. Таким образом, ваш экземпляр 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

Ты звонишь prepare() метод, поэтому аннотации транзакции не рассматриваются. Вам нужно будет вызвать его через собственный интерфейс, т.е. myTestTimerLocal.prepare()для любого транзакционного эффекта.

Другие вопросы по тегам