Skip to content

Commit

Permalink
Incorrect state for TransactionManager.manager after calling closeAnd…
Browse files Browse the repository at this point in the history
…Unregister #1100
  • Loading branch information
Tapac committed Jan 16, 2021
1 parent 0a4a121 commit fea6952
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,11 @@ interface TransactionManager {
private val registeredDatabases = ConcurrentHashMap<Database, TransactionManager>()

fun registerManager(database: Database, manager: TransactionManager) {
if (defaultDatabase == null) {
currentThreadManager.remove()
}
registeredDatabases[database] = manager
databases.push(database)
databases.push(database)
}

fun closeAndUnregister(database: Database) {
Expand Down Expand Up @@ -124,4 +127,5 @@ internal inline fun TransactionInterface.closeLoggingException(log: (Exception)
}
}

val Database?.transactionManager: TransactionManager get() = TransactionManager.managerFor(this) ?: throw RuntimeException("database ${this} don't have any transaction manager")
val Database?.transactionManager: TransactionManager
get() = TransactionManager.managerFor(this) ?: throw RuntimeException("database $this don't have any transaction manager")
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ class MultiDatabaseTest {
db2
TransactionManager.defaultDatabase = db1
assertEquals(TransactionManager.defaultDatabase, db1)
TransactionManager.defaultDatabase = null
}

@Test
Expand All @@ -224,5 +225,6 @@ class MultiDatabaseTest {
TransactionManager.defaultDatabase = db1
TransactionManager.closeAndUnregister(db1)
assertEquals(TransactionManager.defaultDatabase, db2)
TransactionManager.defaultDatabase = null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -321,3 +321,19 @@ class TransactionIsolationTest : DatabaseTestsBase() {
}
}
}

class TransactionManagerResetTest {
@Test
fun `test closeAndUnregister with next Database-connect works fine`() {
val db1 = TestDB.H2.connect()
val db1TransactionManager = TransactionManager.managerFor(db1)
assertEquals(db1TransactionManager, TransactionManager.manager)
transaction(db1) {
exec("SELECT 1 from dual;")
}
TransactionManager.closeAndUnregister(db1)
assertNotEquals(db1TransactionManager, TransactionManager.manager)
val db2 = TestDB.H2.connect()
assertEquals(TransactionManager.managerFor(db2), TransactionManager.manager)
}
}

0 comments on commit fea6952

Please sign in to comment.