문제

저는 Spring을 사용하는 Java 앱을 개발 중입니다. IoC 및 JDBC 템플릿 클래스.4가지 메소드가 있는 DAO 클래스가 있습니다.m1() ~ m4().m1은 테이블 t1, m2는 테이블 t2, m3은 t3 등에서 다중 삽입 및 업데이트를 수행합니다.

DAO 메소드는 다음과 같이 사용됩니다.

while(true)
{
  //process & generate data

  dao.m1(data1);
  dao.m2(data2);
  dao.m3(data3);
  dao.m4(data4);

  //sleep
}

4개의 연속 메서드 호출에서 db 작업을 원자적으로 수행하고 싶습니다. 4개의 테이블이 모두 성공적으로 업데이트되거나 업데이트되지 않습니다.따라서 m3()에서 작업을 수행하는 동안 오류가 발생하면 m2 및 m1에서 수행된 모든 변경 사항(업데이트 및 삽입)을 롤백하고 싶습니다.

그렇다면 Spring에서는 다음과 같은 방식으로 작업을 수행할 수 있나요?

while (true)
{
  //process & generate data

  transaction = TransactionManager.createNewTransaction();

  transaction.start()

  try
  {
    dao.m1(data1);
    dao.m2(data2);
    dao.m3(data3);
    dao.m4(data4);
  }
  catch(DbUpdateException e)
  {
    transaction.rollBack();
  }

  transaction.end();

  // sleep

}

아니면 더 좋은 방법이 있나요?

도움이 되었습니까?

해결책

완전성을 위해 프로그램 솔루션은 다음과 같습니다.

private TransactionTemplate transactionTemplate;

public setTransactionManager(PlatformTransactionManager transactionManager) {
  this.transactionTemplate = new TransactionTemplate(transactionManager);
}

...

while (true) {

  transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    protected void doInTransactionWithoutResult(TransactionStatus status) {
      try {
        dao.m1(data1);
        dao.m2(data2);
        dao.m3(data3);
        dao.m4(data4);
      } catch(DbUpdateException e) {
        status.setRollbackOnly();
      }
    }
  });
}

다른 팁

예 봄이 당신을 허용합니다 프로그래밍 방식으로 거래를 제어합니다.

개인적으로 나는 선호합니다 선언적 거래 주석을 사용하여 다음과 같습니다.

public void runBatchJob() {
  while (true) {
    // generate work
    doWork(unitOfWork);
  }
}

@Transactional
private void doWork(UnitOfWork work) {
  dao.m1(data1);
  dao.m2(data2);
  dao.m3(data3);
  dao.m4(data4);
}

DAO 함수가 정의되는 경우 :

@Transactional
public void m1(Data data) {
  ...
}

이것은 당신에게 필요합니다 ApplicationContext.xml:

<tx:annotation-driven/>

선언적 거래는 거래가 필요하다고 선언 할 수 있으며, 새로운 거래가 필요하며, 지원 거래 등. @Transactional 던지는 a RuntimeException.

예, 해당 통화를 메소드 내부에 넣고 거래를 지정할 수 있습니다. 선언적으로.

해당 코드를 추가 할 필요가 없습니다. Spring은 귀하를 위해 수행 할 수 있습니다.

Spring은 설명된 대로 @Transactional을 사용하거나 원하는 경우 XML을 사용하여 이 모든 것을 처리할 수 있습니다.

올바르게 이해해야 할 중요한 점은 다음과 같은 유형입니다. 거래 전파 당신은 당신의 응용 프로그램에 따라 모든 것을 원합니다.

기본적으로 트랜잭션이 없으면 시작되고, 이미 시작된 경우 기존 트랜잭션을 다시 사용합니다.이것은 4개의 DAO가 모두 원자적이기를 원하는 경우에 원하는 동작입니다.

(MyService)라는 DAO 메서드를 관리할 클래스에 @Transactional을 추가합니다. 이 계층 아래의 모든 항목은 이제 해당 트랜잭션 경계에 참여하게 됩니다.

즉:

@Transactional
public void m1(Data data) {
 ...
}

@Transactional
public void m2(Data data) {
 ...
}

코드에서 이 작업을 수행하는 것은 완전히 불필요합니다.

보다 자세한 내용은 여기

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top