2012-09-11 1 views
1

엔티티를 유지하기 위해 트랜잭션을 사용해야하는 이유는 무엇입니까? 내 persistence.xml에 자동 커밋을 추가 할 수있는 것이 있습니까? IMO 이러한 설정에 없다 JPA에서 SQL Server 트랜잭션을 어떻게 자동 커밋합니까?

em.getTransaction().begin(); 
em.persist(this); 
em.getTransaction().commit(); 

내가 내 초기 기준점 this GWT doco

public void persist() 
{ 
    EntityManager em = entityManager(); 
    try 
    { 
    em.persist(this); 
    } 
    finally 
    { 
    em.close();  
    } 
} 

답변

1

JPA 등의 거래 유형을 언급 할 수 JPA에서

; "persist()"는 스펙에 따라 다음 트랜잭션까지 대기하도록 정의됩니다. 분명히 JPA의 일부 구현 (예 : DataNucleus JPA)은 (자동 커밋) 기능을 제공하지만 JPA 사양을 넘어서는 것입니다 (

+0

[link] (https://developers.google.com/web- 툴킷/doc/latest/DevGuideRequestFactory)에는 트랜잭션을 사용하지 않는 예제가 있습니다. 왜 그렇게 생각합니까? – upshake

+0

그게 뭔가요? Google AppEngine은 자동 커밋 모드를 제공하는 JPA 구현 인 DataNucleus JPA를 사용합니다 (이미 말했듯이) – DataNucleus

+0

우수합니다. 감사. – upshake

1

이었다고 생각한다 :

em.persist(this); 

을하지만이 작업을 수행합니다

이 삽입되지 않습니다 persistence.xml

이 패턴은 연결에서 자동 커밋을 false로 설정 한 다음 원하는 수의 쿼리를 실행할 수있는 JDBC 트랜잭션 관리에서 채택되었다고 생각합니다. 그러나 연결 커밋을 호출하지 않으면 트랜잭션이 커밋되지 않습니다. autocommit이 false (기본값) 인 경우 실행 된 각 명령문은 암시 적으로 커밋되고 원자 연산에서 실행해야하는 명령문이 여러 개있는 경우이 작업을 원하지 않습니다.

예제를 사용하면 개체를 유지할 때 해당 개체가 더럽고 계속 유지되어야하는 연결이있을 수 있습니다. 따라서 원자 적으로 실행해야하는 SQL이 두 개 이상 있습니다. 따라서 위에서 언급 한 거래 관리 전략이 사용됩니다.

(JPA의) 엔티티 관리자와 (최대 절전 모드의) 세션 API는 데이터베이스에서 CRUD 작업을 추상화하도록 설계되었습니다. 실제로 생성 된 SQL 문을 커밋하기 위해 트랜잭션 API는 트랜잭션 관리에 대한 추상화로 설계되었습니다. 필자가 생각하기에 이러한 분리 된 추상화의 이유는 트랜잭션이 일반적으로 리소스 로컬 트랜잭션과 분산 트랜잭션의 두 가지 유형이라는 것입니다.

리소스 로컬 트랜잭션은 분산 트랜잭션보다 트랜잭션 관리 인프라에서 다른 방식으로 처리해야합니다. 리소스 로컬 트랜잭션에서 데이터베이스에 전송 된 모든 SQL은 연결시 커밋이 호출되거나 연결시 롤백이 호출 될 때 롤백 될 때 데이터베이스에 의해 커밋됩니다. 분산 트랜잭션 관리에서 트랜잭션 관리자 구성 요소는 모든 참가자에게 커밋 또는 롤백 신호를 관리하는 구성 요소입니다. 당신이 그런 행동을 정의하지 않습니다

<persistence-unit transaction-type="RESOURCE_LOCAL or JTA"> 
................................. 
</persitence-unit> 
관련 문제