From 6bdf063af4a6a806f02efd621750456e723dcea8 Mon Sep 17 00:00:00 2001 From: "Andrey.Tarashevskiy" Date: Sat, 27 Nov 2021 15:53:50 +0300 Subject: [PATCH] Bug when calling TransactionManager.closeAndUnregister from a different Thread. #1387 --- .../exposed/sql/transactions/TransactionApi.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 }