โข
TransacitonInterceptoor
โฆ
invokeWithinTransaction
โข
TAS
โฆ
createTransactionIfNecessary
โฆ
tm.getTransaction
โข
APTM
โฆ
startTransaction
โฆ
doBegin
โข
JTM
โฆ
getJpaDialect().beginTransaction
โข
AJD
โฆ
entityManager.getTransaction().begin
โข
TI(TransactionImpl)
โฆ
this.transactionDriverControl.begin
โข
LCMI(LogicalConnectionManagedImpl)
โฆ
getConnectionForTransactionManagement
โฆ
getPhysicalConnection
โฆ
acquireConnectionIfNeeded
โฆ
jdbcConnectionAccess.obtainConnection
โข
HikariDataSource
โฆ
getConnection
service ์ transactional ์ด ์์ ์
repository ํธ์ถํ๋ฉด connection ํ๋
2๋ฒ ํธ์ถํ๋ฉด ๋ ๋ค ์ปค๋ฅ์
์ด ๋ค๋ฆ ๊ทผ๋ฐ ๊ฐ์
hikari proxy connection ์ ๋ค๋ฅธ๋ฐ ๊ฒฐ๊ตญ jdbc connection ์ ๊ฐ์!
์์ผ๋ฉด hikari proxy connection ๊น์ง ๊ฐ๋ค! ์๋๋ฏ ์ด๋ฏธ service ๋ฉ์๋ ํธ์ถ ์ ์ ์ปค๋ฅ์
์ ํ๋ํ๊ฑฐ๋ !
โ ์๋ง hikari proxy connection ์ ๋
ผ๋ฆฌ์ ์ปค๋ฅ์
, jdbc connection ์ ๋ฌผ๋ฆฌ์ ์ปค๋ฅ์
1.
ํธ๋์ญ์
๋๊ธฐํ
a.
๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ ๊ณผ ํธ๋์ญ์
์๋น์ค ์ฌ์ด ์ข
์์ฑ ์ ๊ฑฐ
b.
DataSourceUtils.getConnection(dataSource);
c.
ํ์ ์ค์ ์ฟผ๋ฆฌ ๋ฉ์๋ ์คํ ์ ๋ฐ์์จ ๋๊ธฐํ ๋งค๋์ ์ ์๋ connection ์ด์ฉ
d.
์ฌ๋ฌ ์ฟผ๋ฆฌ ๋ฉ์๋ ์คํ ์ ์๋๋ ๊ฐ ๋ฉ์๋๋ง๋ค ๋ฐ์์จ connection์ ํ๋ผ๋ฏธํฐ๋ก ๋ฃ์ด์ ๊ฐ์ connection ์์ ๋ณด์ฅํด์ผ ํ๋๋ฐ ํธ๋์ญ์
๋๊ธฐํ ๋งค๋์ ๋ก ํ๋ผ๋ฏธํฐ๋ก ๋ฃ์ ํ์ ์์ด connection ์ ๊ฐ๊ฒ ๋ณด์ฅ ๊ฐ๋ฅํ๋ค!
2.
ํธ๋์ญ์
์ถ์ํ
a.
get transaction ์ ์ฉ์ดํ๊ฒ
b.
jdbc, jpa, hibernate ์ด ๋ชจ๋ ํธ๋์ญ์
์ ์ป์ด์ค๋ ๋ฐฉ์์ด ๋ค๋ฅด๋ค.
c.
ํ๋ซํผ ํธ๋์ญ์
๋งค๋์ ๋ก ์ถ์ํ!
1.
CrudMethodMetadataPopulatingMethodInterceptor ์์ TransactionSynchronizationManager.getResource(method); ํธ์ถ
๊ทผ๋ฐ ์ฒ์์ด๋ฉด null ์ด๋ผ bindResource() ํธ์ถ
2.
TransactionInterceptor โ PlatformTransactionManager(getTransaction()) โ TSM(getResource) ์์ผ๋ก ํธ์ถ
3.
transaction ์ด ์์ผ๋๊น PTM(startTransaction()) ํธ์ถ, connection ์์!
init ํ ๋ Pool ์์ JdbcConnection ์ ์์ฑํ๋ค. async ๋ก ๋๋ ๊ฒ ๊ฐ๋ค,,
init ํ ๋ ๊ณ์ connection ๋ถ๋ฅธ ์ด์ !
โ select name, value from information_schema.settions where name in (?, ?, ?, ?); ์ธํ
ํ์ธํ๋ ค๊ณ !
โ schema, data scripts ๋ฃ๊ธฐ ์ํด!
Transaction ์ด ๋ค๋ฅด๋ฉด connection ์ด ๋ค๋ฅด๋ค!
โ ๋ฐ์ ๋ง๊ณ ๋ฐ์ ํ๋ฆฌ๋ค.
connection ์ด ๋ฐํ์ด ์ด๋ฏธ ๋์์ผ๋ฉด ๋ ๋๊ฐ์ connection ์ ์ฌ์ฉํ๋ค.
// @Transactional - service ๋ฉ์๋์ traction ์๋ ์ํ
public void test() {
memberRepository.save(); // connection ์ฐ๊ณ ๋ฐํ
memberRepository.save(); // ์์ ๋๊ฐ์ connection ์ฐ๊ณ ๋ฐํ
}
Java
๋ณต์ฌ
์ด๊ฒ connection pool ์ด list ๋ก ๋์ด์๊ธด ํจ. ๊ทธ๋์ ๊ทธ๋ฐ๊ฑด์ง connection ๊ฐ์ ธ์ค๋ ์์ ์ ํ์ธํด๋ณด์
์๋๋ฉด ๋๊ฐ์ ์ฐ๋ ๋๋ผ์ ๊ทธ๋ด์ง๋?
์๋ก์ด Transaction ์ด๋ฉด ๋ค๋ฅธ connection ์ ์ฌ์ฉํ๋ค.
@Transactional
public void test() {
memberRepository.save();
anotherService.test2();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void test2() {};
Java
๋ณต์ฌ
์์ง test() ์์ connection ์ด ๋ฐํ๋์ง ์์ ์ํ, REQUIRES_NEW ๋ก ์๋ก์ด ํธ๋์ญ์
์ ์ด๋ฉด connection ์ด ๋ค๋ฅด๋ค.