Spring - Transaction Management
ACID:
Atomicity(유일성, 원자성): Transaction은 운영의 전체 절차가 성공이거나 실패를 의미하는 운영의 단일 단위로써 취급되어질 수 있다.(--> 어렵게 생각하지 말자. 한번에 실행할 수 있는 단위여야 한다는 이야기다.)(A transaction should be treated as a single unit of operation which means either the entire sequence of operations is successful or unsuccessful.)
Consistency(정합성): Table의 유일한 PK(unique primary key), database의 참고적인 무결성등의 정합성을 나타낸다.(--> 어렵게 생각하지 말자. 데이터의 앞뒤가 잘 맞아야 한다는 이야기다.)(This represents the consistency of the referential integrity of the database, unique primary keys in tables etc.)
Isolation(고립성): Transaction 동시에 같은 데이터를 처리하는 많은 transaction이 있을 수 있다. 각각의 transaction은 데이터의 오염을 방지하기 위해 각각으로 부터 고립되어야 한다.(--> 어렵게 생각하지 말자. 죽을려면 혼자 죽지 다른넘 건드리고 그러지 말라는 소리다.)(There may be many transactions processing with the same data set at the same time, each transaction should be isolated from others to prevent data corruption.)
Durability(내구성, 영속성): Transaction이 완료된 이후에는 그 결과는 영속성을 갖고 system 실패로 인하여 database로부터 삭제될 수 없다.(--> 완료된 녀석은 지워지면 안된다는 소리다.) (Once a transaction has completed, the results of this transaction have to be made permanent and cannot be erased from the database due to system failure.)
Begin the transaction using begin transaction command. (begin transaction 명령을 사용하는 transaction 시작)
Perform various deleted, update or insert operations using SQL queries. (SQL query를 사용하는 다수의 delete, update, insert 명령 수행)
If all the operation are successful then perform commit otherwise rollback all the operations. (모든 명령이 성공하면 commit수행, 아니면 모든 명령을 rollback)
Local vs. Global Transactions
Programmatic vs. Declarative
Programmatic transaction management: 프로그램의 도움으로 transaction을 관리하는 것을 의미한다. 이는 극단적일만큼 유연함을 제공하지만 유지하기가 어렵다.(This means that you have manage the transaction with the help of programming. That gives you extreme flexibility, but it is difficult to maintain.)
Declarative transaction management: 비즈니스 코드로부터 transaction 관리를 분리함을 의미한다. Transaction을 관리하기 위해 annotation또는 XML기반 설정을 사용하면 된다. (This means you separate transaction management from the business code. You only use annotations or XML based configuration to manage the transactions.)
Spring Transaction Abstractions
public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition); throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
S.N. | Method & Description |
---|---|
1 | TransactionStatus getTransaction(TransactionDefinition definition) This method returns a currently active transaction or create a new one, according to the specified propagation behavior. |
2 | void commit(TransactionStatus status) This method commits the given transaction, with regard to its status. |
3 | void rollback(TransactionStatus status) This method performs a rollback of the given transaction. |
public interface TransactionDefinition { int getPropagationBehavior(); int getIsolationLevel(); String getName(); int getTimeout(); boolean isReadOnly(); }
S.N. | Method & Description |
---|---|
1 | int getPropagationBehavior() 이 함수는 전파(propagation) 동작을 반환한다. Spring은 EJB CMT로부터 모든 익숙한 transaction propagaton옵션을 제공한다. |
2 | int getIsolationLevel() This method returns the degree to which this transaction is isolated from the work of other transactions. 이 함수는 transaction이 다른 transaction의 작업에서 격리(isolate)되어지기 위한 정도를 반환한다. |
3 | String getName() 이 함수는 transaction의 이름을 반환한다. |
4 | int getTimeout() 이 함수는 transaction이 완료되어야 하는 시간을 초로 반환한다. |
5 | boolean isReadOnly() 이 함수는 transaction이 read-only인지를 반환한다. |
가능한 격리수준(isolation level)의 값은 아래와 같다.
S.N. | Isolation & Description |
---|---|
1 | TransactionDefinition.ISOLATION_DEFAULT 기본 격리 수준 |
2 | TransactionDefinition.ISOLATION_READ_COMMITTED dirty read가 방해받았음을 표시. 비반복적 읽기(non-repeatable)와 유령 읽기(phantom)가 발생할 수 있다. ** 더티 읽기(dirty read): 더티 읽기는, 트랜잭션이 객체를 갱신하고 갱신이 커밋되기 전에, 다른 트랜잭션이 이 객체를 검색/갱신하도록 허용되었을 때 발생한다 ** dirty read : 한 트랜잭션이 다른 트랜잭션이 일으킨 커밋되지 않은 변경을 볼 수 있음커밋되지 않은 변경이 롤백되면, 다른 트랜잭션은 dirty data를 가짐 ** repeatable read : 질의가 몇번 만들어졌는지와 트랜잭션이 읽는 행들에 다른 트랜잭션이 변경을 몇번 가했는지에 관계 없이 트랜잭션이 동일 질의에서 항상 동일한 데이터를 읽을 때 나타남 이는 읽기를 행하는 트랜잭션은 다른 트랜잭션이 만든 커밋된 변경을 보지 않을 것이다. ** phantom read: 2번의 읽기 트랜잭션 사이에 새로운 행이 추가되었다면, phantom read일 경우 이 phantom row가 보이고 그렇지 않다면 1번째 읽기와 같은 결과가 보인다. |
3 | TransactionDefinition.ISOLATION_READ_UNCOMMITTED dirty read, 비반복 읽기, 유령읽기가 발생할 수 있음을 표시. |
4 | TransactionDefinition.ISOLATION_REPEATABLE_READ dirty read와 비반복 읽기가 방해받았음을 표시. 유령읽기는 발생할 수 있다. |
5 | TransactionDefinition.ISOLATION_SERIALIZABLE dirty read, 비반복 읽기, 유령읽기가 방해받았음을 표시 |
Following are the possible values for propagation types:
전파(propagation)타입을 위해 가능한 값은 아래와 같다.
S.N. | Propagation & Description |
---|---|
1 | TransactionDefinition.PROPAGATION_MANDATORY 현재 transaction을 지원. 만약 현재 transaction이 없으면 exception 발생 |
2 | TransactionDefinition.PROPAGATION_NESTED 현재 transaction이 있다면 nested transaction에서 실행 |
3 | TransactionDefinition.PROPAGATION_NEVER 현재 transaction 지원 안함. 만약 현재 transaction이 있다면 exception 발생 |
4 | TransactionDefinition.PROPAGATION_NOT_SUPPORTED 현재 transaction지원 안함. 오히려 항상 non-transaction하게 실행. |
5 | TransactionDefinition.PROPAGATION_REQUIRED 현재 transaction 지원. 만약 없으면 새로 하나 생성 |
6 | TransactionDefinition.PROPAGATION_REQUIRES_NEW 새로운 transaction 생성. 만약 이미 존재하면 현재 transaction을 멈춘다(suspend) |
7 | TransactionDefinition.PROPAGATION_SUPPORTS 현재 transaction 지원. 만약 없으면 non-transaction하게 실행 |
8 | TransactionDefinition.TIMEOUT_DEFAULT transaction system에 기반한 기본 timeout 사용 또는 timeout이 지원되지 않으면 none 사용. |
TransactionStatus interface는 transaction 실행(execution)과 transaction 상태 질의(query)를 제어(control)하기 위한 transaction code를 위한 간단한 방법을 제공한다.
public interface TransactionStatus extends SavepointManager { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); boolean isCompleted(); }
S.N. | Method & Description |
---|---|
1 | boolean hasSavepoint() 이 함수는 transaction이 내부적으로 savepoint 즉, save point를 기반으로 nested transaction으로써 생성되어진 transaction인지를 반환한다. |
2 | boolean isCompleted() 이 함수는 transaction이 완료되었는지 즉, 이미 commit 또는 rollback되었는지를 반환한다. |
3 | boolean isNewTransaction() 이 함수는 존재하는 transaction이 새로 생성된 경우 true를 반환한다. |
4 | boolean isRollbackOnly() 이 함수는 transaction이 rollback-only로써 표시되었는지를 반환한다. |
5 | void setRollbackOnly() 이 함수는 transaction rollback-only를 설정한다. |