Kotlin Expuesto no realiza transacción

Siguiendo el ejemplo proporcionado en Exposed , no puedo leer las tablas / datos creados fuera de la transacción que lo crea. Estoy usando la database h2-in-memory.

La exception es:

Exception in thread "main" org.h2.jdbc.JdbcSQLException: Table "CITIES" not found; SQL statement: 

He agregado una llamada para confirmar, pero esto no ayuda. Si leo los datos dentro de la transacción que crea los datos, como en el ejemplo en el enlace a github, funciona bien. Aquí la versión simplificada de esto:

 fun main(args: Array<String>) { Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") transaction { create(Cities) City.new { name = "St. Petersburg" } println("Cities: ${City.all().joinToString { it.name }}") //I have added this commit here commit() } //I want to read the data outside the transaction, but it does not work transaction { println("Cities: ${City.all().joinToString { it.name }}") } } 

¿Cómo puedo persistir con los datos?

Al agregar logger.addLogger(StdOutSqlLogger) obtiene el siguiente resultado:

 SQL: CREATE TABLE IF NOT EXISTS CITIES (ID INT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(50) NOT NULL) SQL: INSERT INTO CITIES (NAME) VALUES ('St. Petersburg') SQL: SELECT CITIES.ID, CITIES.NAME FROM CITIES 

Sí compromete la transacción. El problema es que cuando la database en memory se cierra, se elimina y la database en la memory se cierra en las siguientes circunstancias:

Por defecto, H2 cierra la database cuando se cierra la última connection

Fuente

Aquí hay un diagtwig, así que es más fácil entender lo que sucede paso a paso (cuando se cierra la database, se elimina por completo)

diagrama

La solución más sencilla es simplemente usar una database de file real en lugar de una en memory.

Cambiar el DB de en la memory a Database.connect("jdbc:h2:~/test", driver = "org.h2.Driver") solucionó el problema.

Parece que te alejaste de la memory H2 para resolver tu problema. Tenga en count que la raíz de su problema inicial probablemente se debió a que se le debe decir a H2 que mantenga sus tablas durante la vida de la JVM:

jdbc: h2: mem: testing; DB_CLOSE_DELAY = -1

más explicado aquí: H2 en la database en memory. Tabla no encontrada