fix(charge): 이벤트 작업 즉시 지급 트랜잭션을 분리한다
This commit is contained in:
@@ -18,6 +18,7 @@ import org.springframework.context.ApplicationEventPublisher
|
|||||||
import org.springframework.dao.DataIntegrityViolationException
|
import org.springframework.dao.DataIntegrityViolationException
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import org.springframework.transaction.PlatformTransactionManager
|
import org.springframework.transaction.PlatformTransactionManager
|
||||||
|
import org.springframework.transaction.TransactionDefinition
|
||||||
import org.springframework.transaction.annotation.Transactional
|
import org.springframework.transaction.annotation.Transactional
|
||||||
import org.springframework.transaction.support.TransactionSynchronization
|
import org.springframework.transaction.support.TransactionSynchronization
|
||||||
import org.springframework.transaction.support.TransactionSynchronizationManager
|
import org.springframework.transaction.support.TransactionSynchronizationManager
|
||||||
@@ -37,7 +38,11 @@ class ChargeEventJobService(
|
|||||||
private val applicationEventPublisher: ApplicationEventPublisher? = null,
|
private val applicationEventPublisher: ApplicationEventPublisher? = null,
|
||||||
transactionManager: PlatformTransactionManager? = null
|
transactionManager: PlatformTransactionManager? = null
|
||||||
) {
|
) {
|
||||||
private val transactionTemplate = transactionManager?.let { TransactionTemplate(it) }
|
private val transactionTemplate = transactionManager?.let {
|
||||||
|
TransactionTemplate(it).also { template ->
|
||||||
|
template.propagationBehavior = TransactionDefinition.PROPAGATION_REQUIRES_NEW
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
fun createAndProcessImmediate(sourceChargeId: Long, memberId: Long): ChargeEventJob? {
|
fun createAndProcessImmediate(sourceChargeId: Long, memberId: Long): ChargeEventJob? {
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ import org.junit.jupiter.api.Assertions.assertEquals
|
|||||||
import org.junit.jupiter.api.Assertions.assertNotNull
|
import org.junit.jupiter.api.Assertions.assertNotNull
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
import org.mockito.Mockito
|
import org.mockito.Mockito
|
||||||
|
import org.springframework.transaction.TransactionDefinition
|
||||||
|
import org.springframework.transaction.support.AbstractPlatformTransactionManager
|
||||||
|
import org.springframework.transaction.support.DefaultTransactionStatus
|
||||||
|
import org.springframework.transaction.support.TransactionTemplate
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
|
|
||||||
class ChargeEventJobServiceTest {
|
class ChargeEventJobServiceTest {
|
||||||
@@ -61,6 +65,19 @@ class ChargeEventJobServiceTest {
|
|||||||
Mockito.verify(memberRepository, Mockito.never()).findByIdForUpdate(Mockito.anyLong())
|
Mockito.verify(memberRepository, Mockito.never()).findByIdForUpdate(Mockito.anyLong())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun shouldUseRequiresNewTransactionForAfterCommitImmediateProcessing() {
|
||||||
|
val service = ChargeEventJobService(
|
||||||
|
jobRepository = Mockito.mock(ChargeEventJobRepository::class.java),
|
||||||
|
chargeRepository = Mockito.mock(ChargeRepository::class.java),
|
||||||
|
memberRepository = Mockito.mock(MemberRepository::class.java),
|
||||||
|
transactionManager = RecordingTransactionManager()
|
||||||
|
)
|
||||||
|
val transactionTemplate = service.transactionTemplateForTest()
|
||||||
|
|
||||||
|
assertEquals(TransactionDefinition.PROPAGATION_REQUIRES_NEW, transactionTemplate.propagationBehavior)
|
||||||
|
}
|
||||||
|
|
||||||
private fun job(
|
private fun job(
|
||||||
id: Long,
|
id: Long,
|
||||||
memberId: Long = 10L,
|
memberId: Long = 10L,
|
||||||
@@ -87,3 +104,16 @@ class ChargeEventJobServiceTest {
|
|||||||
return Member(password = "pw", nickname = "tester").also { it.id = id }
|
return Member(password = "pw", nickname = "tester").also { it.id = id }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun ChargeEventJobService.transactionTemplateForTest(): TransactionTemplate {
|
||||||
|
val field = ChargeEventJobService::class.java.getDeclaredField("transactionTemplate")
|
||||||
|
field.isAccessible = true
|
||||||
|
return field.get(this) as TransactionTemplate
|
||||||
|
}
|
||||||
|
|
||||||
|
private class RecordingTransactionManager : AbstractPlatformTransactionManager() {
|
||||||
|
override fun doGetTransaction(): Any = Any()
|
||||||
|
override fun doBegin(transaction: Any, definition: TransactionDefinition) {}
|
||||||
|
override fun doCommit(status: DefaultTransactionStatus) {}
|
||||||
|
override fun doRollback(status: DefaultTransactionStatus) {}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user