복붙노트

[SPRING] Spring에서 트랜잭션 일시 중지는 어떻게 작동합니까?

SPRING

Spring에서 트랜잭션 일시 중지는 어떻게 작동합니까?

내 질문은 기본적으로 여기에있는 것과 같지만 답변에 만족하지 않아서이 질문을 씁니다.

Spring Framework 매뉴얼에서는 PROPAGATION_REQUIRES_NEW에 대해 현재 트랜잭션이 일시 중단 될 것이라고 명시되어 있습니다. 어떻게 실제로 구현됩니까? 대부분의 데이터베이스는 중첩 트랜잭션을 지원하지 않으며 한 연결에서 하나의 트랜잭션 만 실행할 수 있음을 알고 있습니다. 다시 말해 원래 트랜잭션을 커밋하거나 롤백해야하기 때문에 원래 트랜잭션을 "사용하지 않고"새 트랜잭션을 시작할 수는 없습니다.

예:

START TRANSACTION
SELECT ...
UPDATE ...
-- Now we run method with PROPAGATION_REQUIRES_NEW
-- How do we "suspend" transaction so we can start new one?
START TRANSACTION
UPDATE ...
COMMIT
-- We returned from the method, result was commited
-- Now we'd like to "unsuspend" the original transaction so it can be commited/rollbacked, but how?

아니면 다른 연결 (Session 객체)을 사용하여 구현할 수 있습니까? 그래서 우리는 원래의 연결을 사용하지 않고 새로운 트랜잭션을 시작할 수있는 새로운 연결을 만듭니다.

나는 아무 것도 그럴 수 없다는 것을 너무도 명백히 여기에서 놓치고있다. (적어도 Spring docs, Spring in Action, Hibernate를 가진 Spring persistence는 아님).

고마워요!

해결법

  1. ==============================

    1.트랜잭션을 일시 중단하는 지점은 스레드의 현재 트랜잭션을 새로운 트랜잭션으로 변경하는 것입니다. 새 트랜잭션과 일시 중단 된 트랜잭션이 서로 완전히 독립적이므로 중첩 트랜잭션의 의미와 일치하지 않습니다. 트랜잭션을 일시 중단 할 수 있도록 연결 수준 API가 없으므로 다른 연결을 사용하여이 작업을 수행해야합니다. Spring에서 JTA를 사용하고 있다면 JTA 트랜잭션 관리자가이를 수행한다. DataSourceTransactionManager를 사용하는 경우 코드를 살펴보면 현재 연결을 "일시 중단 된 리소스"로 저장하고 새 트랜잭션의 데이터 소스에서 새 연결을 가져 오는 것을 볼 수 있습니다.

    트랜잭션을 일시 중단하는 지점은 스레드의 현재 트랜잭션을 새로운 트랜잭션으로 변경하는 것입니다. 새 트랜잭션과 일시 중단 된 트랜잭션이 서로 완전히 독립적이므로 중첩 트랜잭션의 의미와 일치하지 않습니다. 트랜잭션을 일시 중단 할 수 있도록 연결 수준 API가 없으므로 다른 연결을 사용하여이 작업을 수행해야합니다. Spring에서 JTA를 사용하고 있다면 JTA 트랜잭션 관리자가이를 수행한다. DataSourceTransactionManager를 사용하는 경우 코드를 살펴보면 현재 연결을 "일시 중단 된 리소스"로 저장하고 새 트랜잭션의 데이터 소스에서 새 연결을 가져 오는 것을 볼 수 있습니다.

  2. from https://stackoverflow.com/questions/19526604/how-does-transaction-suspension-work-in-spring by cc-by-sa and MIT license