kqr
01/09/2021, 1:48 PMimport org.springframework.transaction.PlatformTransactionManager
import org.springframework.transaction.support.DefaultTransactionDefinition
import org.springframework.transaction.support.TransactionTemplate
import java.util.concurrent.ConcurrentHashMap
class DefaultTransactionManagerProvider {
companion object {
const val DEFAULT_MANAGER_NAME = "default"
private val managers = ConcurrentHashMap<String, PlatformTransactionManager>()
fun registerManager(platformTransactionManager: PlatformTransactionManager, name: String = DEFAULT_MANAGER_NAME) {
managers[name] = platformTransactionManager
}
fun get(name: String = DEFAULT_MANAGER_NAME): PlatformTransactionManager =
managers[name] ?: throw IllegalStateException("Transaction manager named [$name] not provided")
}
}
fun <R> transactional(
transactionManagerName: String = DefaultTransactionManagerProvider.DEFAULT_MANAGER_NAME,
transactionManager: PlatformTransactionManager = DefaultTransactionManagerProvider.get(transactionManagerName),
propagationBehaviour: Int = DefaultTransactionDefinition().propagationBehavior,
isolationLevel: Int = DefaultTransactionDefinition().isolationLevel,
timeout: Int = DefaultTransactionDefinition().timeout,
readOnly: Boolean = DefaultTransactionDefinition().isReadOnly,
name: String? = DefaultTransactionDefinition().name,
block: () -> R
): R {
val transactionTemplate = TransactionTemplate(transactionManager)
transactionTemplate.isolationLevel = isolationLevel
transactionTemplate.propagationBehavior = propagationBehaviour
transactionTemplate.timeout = timeout
transactionTemplate.isReadOnly = readOnly
name?.let { transactionTemplate.setName(it) }
val execute = transactionTemplate.execute {
block()
}
return execute!!
}