2015-04-07 2 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 завершена, функция вставки делает все commit.

Почему новая сделка не совершена?

Примечание: Если я изменяю атрибут транзакции функции onStart, НЕОБХОДИМЫЙ 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

+0

Да, это сработало! –

2

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

+0

Я обновил вопрос. Я попробовал '@EJB TestTransactionLocal local; 'и' local.insertObject (i); 'Но это не сработало. –

Смежные вопросы