Spring Transaction ³»ºÎ µ¿ÀÛ ¸ÞÄ¿´ÏÁò
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 ¹æ½ÄÀÎ °æ¿ì)¿¡ ´ëÇÑ ´ÙÀ½°ú °°Àº ½Ã»çÁ¡À» ¾òÀ» ¼ö ÀÖ´Ù.
- Transaction Àº method ´ÜÀ§·Î °ü¸® µÈ´Ù. => method °¡ ³¡³¯ ¶§±îÁö commit ¶Ç´Â connection ¹ÝȯÀÌ ÀÌ·ç¾îÁöÁö ¾Ê´Â´Ù.
- Transaction ´ë»ó method ³»¿¡¼ ¹ß»ýÇÏ´Â SQL Àº µ¿ÀÏÇÑ Connection À» »ç¿ëÇÑ´Ù. (Propagation Á¤Ã¥¿¡ µû¶ó º°µµ Connection »ç¿ë °¡´É)
µû¶ó¼ ó¸® ½Ã°£ÀÌ ±ä method ÀÇ °æ¿ì¿¡´Â Transaction ´ÜÀ§¸¦ Á¶Á¤Çؼ DB Lock Áö¼Ó½Ã°£ÀÌ Áö³ªÄ¡°Ô ±æ¾îÁö°Å³ª DB connection pool ÀÌ ¸ðÀÚ¶óÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù.
Ãâó: http://javafactory.tistory.com/entry/Spring-Transaction-³»ºÎ-µ¿ÀÛ-¸ÞÄ¿´ÏÁò [Elite JAVA °³¹ßÀÚÀÇ ÀúÀå¼Ò]