JPA에서 트랜잭션이 무엇인지 이해하려고합니다. 내가 MySQL 서버에 요청을 sniffering 코드를 디버깅하기 위해 노력하고있어JPA에서 트랜잭션 실현
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="survex" transaction-type="JTA">
<jta-data-source>jdbc/MyDatabase</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
</properties>
</persistence-unit>
</persistence>
:
내가 지속성과 글래스 피시에 배포 된 응용 프로그램이 있다고 가정 해public String create() {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("survex");
EntityManager em = entityManagerFactory.createEntityManager();
Log log = em.find(Log.class, 1);
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // NOTING HAPPENS ...
log.setMessage("xxx");
em.flush(); // OH, HERE IT IS -> SET autocommit=0; UPDATE LOG SET message = 'xxx' WHERE (id = 1)
log.setMessage("aaa");
em.flush(); // OK -> UPDATE LOG SET message = 'aaa' WHERE (id = 1)
transaction.commit(); // NOTHING HAPPENS! WHERE IS COMMIT?!
log = em.find(Log.class, 1);
transaction = em.getTransaction();
transaction.begin(); // STILL NOTHING ...
log.setMessage("555");
em.flush(); // UPDATE LOG SET message = '555' WHERE (id = 1)
log.setMessage("666");
em.flush(); // UPDATE LOG SET message = '666' WHERE (id = 1)
transaction.commit(); // NOTHING!!!
return log.getMessage();
}
// SOMEWHERE OUTSIDE: COMMIT; SET autocommit=1;
왜?! JPA가 왜 이상하게 행동 하는가?
나는 모든 transaction.commit() 호출에 커밋을 기대합니까? 아니면 뭔가 오해하고 있습니다.
.flush 후에 .commit이 필요하다고 생각하십시오. –
아니요 .commit 후 .flush는 예외로 연결됩니다. – corvax