SPRING
2017.04.26 / 22:55

Spring Transaction ³»ºÎ µ¿ÀÛ ¸ÞÄ¿´ÏÁò

tomcater
Ãßõ ¼ö 153

Mybatis ¿Í °°Àº DB ¿¬µ¿ ¶óÀ̺귯¸®¸¦ »ç¿ëÇؼ­ DB¿¡ ¿¬µ¿ÇÒ ¶§ Spring Transaction À» »ç¿ëÇÏ´Â °æ¿ì¿Í °³¹ßÀÚ°¡ Á÷Á¢ Transaction À» °ü¸®ÇÏ´Â 2°¡Áö °æ¿ì°¡ ÀÖ´Ù. ÀÌ °æ¿ì ³»ºÎÀûÀ¸·Î ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö Â÷ÀÌÁ¡À» ¾Ë¸é ´ë¿ë·® Æ®·£Á§¼Ç 󸮿¡ ´ëºñ¸¦ ÇÒ ¼ö ÀÖ´Ù. ¼¼ºÎÀûÀÎ µ¿ÀÛÀ» ¾Ë±â À§ÇØ ´ÙÀ½ »ùÇà ÇÁ·Î±×·¥À» ½ÇÇàÇØ º¸ÀÚ.

 

<Spring ¹× Mybatis ³»ºÎ µ¿ÀÛÀ» ÆľÇÇϱâ À§ÇÑ Log level ¼³Á¤>

  1 <?xml version="1.0" encoding="UTF-8"?> 
  2 <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd"> 
  3 <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
  4  
  5     <!-- Appenders --> 
  6     <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
  7         <param name="Target" value="System.out" /> 
  8         <layout class="org.apache.log4j.PatternLayout"> 
  9             <param name="ConversionPattern" value="%-5p: %c - %m%n" /> 
 10         </layout> 
 11     </appender> 
 12      
 13     <logger name="org.springframework.jdbc"> 
 14         <level value="debug" /> 
 15     </logger> 
 16  
 17     <logger name="org.springframework.transaction"> 
 18         <level value="debug" /> 
 19     </logger> 
 20      
 21     <logger name="java.sql"> 
 22         <level value="debug" /> 
 23     </logger> 
 24          
 25     <logger name="java.sql.Connection"> 
 26         <level value="debug" /> 
 27     </logger>     
 28      
 29     <logger name="java.sql.Statement"> 
 30         <level value="debug" /> 
 31     </logger>     
 32      
 33     <logger name="org.mybatis"> 
 34         <level value="debug" /> 
 35     </logger>         
 36  
 37     <!-- Root Logger --> 
 38     <root> 
 39         <priority value="info" /> 
 40         <appender-ref ref="console" /> 
 41     </root> 
 42      
 43 </log4j:configuration> 
 44 

 

 <Mybatis ±â¹ÝÀÇ DB ¿¬µ¿ ÇÁ·Î±×·¥ - Spring Transaction À» »ç¿ëÇÏÁö ¾Ê´Â °æ¿ì>

  1 package tkstone.test.transaction; 
  2  
  3 public class TransactionInvoker {
  4     private Mapper1 mapper1; 
  5      
  6     public void setMapper1(Mapper1 mapper1){ 
  7         this.mapper1 = mapper1; 
  8     } 
  9      
 10     public String invoke(){ 
 11         System.out.println("*** invoke start"); 
 12         insert1(); 
 13         insert2(); 
 14         System.out.println("*** invoke end"); 
 15         return "transaction invoked"; 
 16     } 
 17  
 18     public void insert1(){ 
 19         A1 a1 = new A1(); 
 20         a1.col1 = "col1"; 
 21         a1.col2 = "col2"; 
 22         mapper1.insertA1(a1); 
 23     } 
 24      
 25     public void insert2(){ 
 26         A2 a2 = new A2(); 
 27         a2.col1 = "col1"; 
 28         a2.col2 = "col2"; 
 29         mapper1.insertA2(a2);         
 30     } 
 31 } // End of TransactionInvoker 
 32 

 

 

 <Mybatis ±â¹ÝÀÇ DB ¿¬µ¿ ÇÁ·Î±×·¥ - Spring Transaction À» »ç¿ëÇÏ´Â °æ¿ì>

  1 ... 
  2     @Transactional 
  3     public String invoke(){ 
  4         System.out.println("*** invoke start"); 
  5         insert1(); 
  6         insert2(); 
  7         System.out.println("*** invoke end"); 
  8         return "transaction invoked"; 
  9     } 
 10 ...

 

¿©±â¼­´Â ¼³¸íÀÇ ÆíÀǸ¦ À§ÇØ Mybatis ³ª Spring ¼³Á¤À» ¸ðµÎ »ý·« ÇÏ¿´´Ù. À§ÀÇ 2°¡Áö ÇÁ·Î±×·¥À» ½ÇÇàÇßÀ» °æ¿ì Ãâ·Â ·Î±×´Â ´ÙÀ½°ú °°´Ù. (¼³¸íÀÇ ÆíÀǸ¦ À§ÇØ ÀϺΠ·Î±×´Â »ý·«ÇÔ)

 

<Spring transaction À» »ç¿ëÇÏÁö ¾Ê¾ÒÀ» °æ¿ì>

*** invoke start

DEBUG: org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession

DEBUG: org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource

DEBUG: org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [jdbc:mysql://localhost:3306/test, UserName=test@localhost, MySQL Connector Java] will not be managed by Spring

DEBUG: org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession 

DEBUG: org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource

 

DEBUG: org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession

DEBUG: org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource

DEBUG: org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [jdbc:mysql://localhost:3306/test, UserName=test@localhost, MySQL Connector Java] will not be managed by Spring

DEBUG: org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession 

DEBUG: org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource

*** invoke end

À§ÀÇ ·Î±×¸¦ º¸¸é ´ÙÀ½°ú °°Àº Ư¡ÀÌ ÀÖ´Ù.

- insert1() ÀÌ È£Ãâ µÉ ¶§ DB connection À» ¾ò¾î ¿Í¼­ SQLÀ» ½ÇÇàÇÑ ÈÄ DB connection À» ¹ÝȯÇÑ´Ù.

- insert2() ÀÌ È£ÃâµÉ ¶§ µ¿ÀÏÇÑ µ¿ÀÛÀ» ¹Ýº¹ÇÑ´Ù.

- insert1()°ú insert2()´Â Mybatis SqlSession °´Ã¼ ¹× DB TransactionÀ» °øÀ¯ÇÏÁö ¾Ê´Â´Ù.

- DB connection Àº auto commit mode À̹ǷΠº°µµÀÇ commit ÀÌ ¹ß»ýÇÏÁö ¾Ê´Â´Ù.

 

¹Ý¸é Spring transaction À» »ç¿ëÇßÀ» °æ¿ì¿¡´Â ·Î±× Ãâ·Â°ªÀÌ ¹Ù²ï´Ù.

DEBUG: org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction 

DEBUG: org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection for JDBC transaction

DEBUG: org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection to manual commit

*** invoke start

DEBUG: org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession

DEBUG: org.mybatis.spring.SqlSessionUtils - Registering transaction synchronization for SqlSession

DEBUG: org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection will be managed by Spring

DEBUG: org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession 

DEBUG: org.mybatis.spring.SqlSessionUtils - Fetched SqlSession from current transaction

DEBUG: org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession 

*** invoke end

DEBUG: org.mybatis.spring.SqlSessionUtils - Transaction synchronization committing SqlSession 

DEBUG: org.mybatis.spring.SqlSessionUtils - Transaction synchronization deregistering SqlSession 

DEBUG: org.mybatis.spring.SqlSessionUtils - Transaction synchronization closing SqlSession 

DEBUG: org.springframework.jdbc.datasource.DataSourceTransactionManager - Initiating transaction commit

DEBUG: org.springframework.jdbc.datasource.DataSourceTransactionManager - Committing JDBC transaction on Connection 

DEBUG: org.springframework.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection after transaction

DEBUG: org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource

À§ÀÇ ·Î±×¸¦ º¸¸é Spring TransactionManager (DatasSourceTransactionManager)°¡ Transaction °ü¸®¸¦ ÇÏ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. 

¿©±â¼­ Áß¿äÇÑ Æ¯Â¡Àº ´ÙÀ½°ú °°´Ù. 

- invoke() method °¡ ½ÃÀ۵DZâ Àü¿¡ DB Connection À» ¾ò¾î ¿Í¼­ Autocommit = false ¼³Á¤À» ÇÑ´Ù.

- invoke() method ³»¿¡¼­´Â ÇϳªÀÇ Mybatis SqlSession °´Ã¼¸¦ »ç¿ëÇؼ­ insert1() ¹× insert2() ¸¦ ½ÇÇàÇÑ´Ù. Áï 2°³ÀÇ insert °¡ ½ÇÇàµÉ ¶§ µ¿ÀÏÇÑ DB Connection À» »ç¿ëÇÑ´Ù.

- invoke() method °¡ ½ÇÇàµÈ ÀÌÈÄ Transaction À» commit ÇÏ°í connection À» ¹ÝȯÇÑ´Ù.

 

¿©±â¼­ Transaction ÀÌ ½ÃÀÛÇÏ´Â ÁöÁ¡Àº invoke() ¸Þ¼Òµå¿¡ ´ëÇÑ Proxy method ³»ºÎÀÌ´Ù. µû¶ó¼­ ´ÙÀ½°ú °°ÀÌ È£Ã⠵ȴÙ. 

È£Ãâ Bean -> Proxy.invoke() ½ÃÀÛ -> Transaction ½ÃÀÛ -> TransactionInvoker.invoke() ó¸® ¿Ï·á -> Transaction commit -> Proxy.invoke() Á¾·á 

 

À§ÀÇ ·Î±×¸¦ º¸¸é Spring Transaction(AOP ¹æ½ÄÀÎ °æ¿ì)¿¡ ´ëÇÑ ´ÙÀ½°ú °°Àº ½Ã»çÁ¡À» ¾òÀ» ¼ö ÀÖ´Ù.

 

  1. Transaction Àº method ´ÜÀ§·Î °ü¸® µÈ´Ù. => method °¡ ³¡³¯ ¶§±îÁö commit ¶Ç´Â connection ¹ÝȯÀÌ ÀÌ·ç¾îÁöÁö ¾Ê´Â´Ù.
  2. Transaction ´ë»ó method ³»¿¡¼­ ¹ß»ýÇÏ´Â SQL Àº µ¿ÀÏÇÑ Connection À» »ç¿ëÇÑ´Ù. (Propagation Á¤Ã¥¿¡ µû¶ó º°µµ Connection »ç¿ë °¡´É)

 

µû¶ó¼­ ó¸® ½Ã°£ÀÌ ±ä method ÀÇ °æ¿ì¿¡´Â Transaction ´ÜÀ§¸¦ Á¶Á¤Çؼ­ DB Lock Áö¼Ó½Ã°£ÀÌ Áö³ªÄ¡°Ô ±æ¾îÁö°Å³ª DB connection pool ÀÌ ¸ðÀÚ¶óÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù.



Ãâó: http://javafactory.tistory.com/entry/Spring-Transaction-³»ºÎ-µ¿ÀÛ-¸ÞÄ¿´ÏÁò [Elite JAVA °³¹ßÀÚÀÇ ÀúÀå¼Ò]