hi there. What do you think about this approach? D...
# spring
k
hi there. What do you think about this approach? Do you see some better approach? should be each class using this transactional block be dependant on TransactioManager or is this global approach feasible?
Copy code
import 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!!
}