У меня проблема. Я работаю над сервером приложений 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 завершена, функция вставки делает все commit.
Почему новая сделка не совершена?
Примечание: Если я изменяю атрибут транзакции функции onStart, НЕОБХОДИМЫЙ NOT_SUPPORTED, он работает так, как я хочу. Почему это работает так?
Да, это сработало! –