diff --git a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/transactions/TransactionApi.kt b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/transactions/TransactionApi.kt index 6374ae0639..6e7dbaf14e 100644 --- a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/transactions/TransactionApi.kt +++ b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/transactions/TransactionApi.kt @@ -58,14 +58,14 @@ interface TransactionManager { internal val currentDefaultDatabase = AtomicReference() var defaultDatabase: Database? - get() = currentDefaultDatabase.get() ?: databases.firstOrNull() - set(value) { currentDefaultDatabase.set(value) } + @Synchronized get() = currentDefaultDatabase.get() ?: databases.firstOrNull() + @Synchronized set(value) { currentDefaultDatabase.set(value) } private val databases = ConcurrentLinkedDeque() private val registeredDatabases = ConcurrentHashMap() - fun registerManager(database: Database, manager: TransactionManager) { + @Synchronized fun registerManager(database: Database, manager: TransactionManager) { if (defaultDatabase == null) { currentThreadManager.remove() } @@ -73,7 +73,7 @@ interface TransactionManager { databases.push(database) } - fun closeAndUnregister(database: Database) { + @Synchronized fun closeAndUnregister(database: Database) { val manager = registeredDatabases[database] manager?.let { registeredDatabases.remove(database) @@ -87,7 +87,7 @@ interface TransactionManager { fun managerFor(database: Database?) = if (database != null) registeredDatabases[database] else manager - internal val currentThreadManager = object : ThreadLocal() { + private val currentThreadManager = object : ThreadLocal() { override fun initialValue(): TransactionManager { return defaultDatabase?.let { registeredDatabases.getValue(it) } ?: NotInitializedManager }