通过数据源为 H2 设置事务隔离级别

Setting the transaction isolation level for a H2 via a DataSource

由于并发更新问题,我正在为我的应用程序尝试不同的隔离级别。我通过 DataSource 设置隔离级别,从中获取数据库连接

BasicDataSource ds = new BasicDataSource();
ds.setDefaultTransactionIsolation(
  Connection.TRANSACTION_REPEATABLE_READ)
/* more config ... */
ds.getConnection()

使用 postgres 9.3 数据库,对行的并发更新会触发错误,这是预期的,根据 Standard SQL Transaction Isolation Levels
上的 postgres 文档 ERROR: could not serialize access due to read/write dependencies among transactions 将隔离级别设置为 Connection.TRANSACTION_READ_COMMITTED

时,此错误会按预期消失

尝试使用内存数据库中的 H2 重现此行为,隔离级别似乎没有改变我的单元测试的结果。即使通过将数据库 url 设置为 LOCK_MODE=0 and/or Connection.TRANSACTION_READ_UNCOMMITTED 来完全停用隔离,我在并发更新 org.h2.jdbc.JdbcSQLException: Concurrent update in table "MyTable": another transaction has updated or deleted the same row

时也会出错

我的问题是:如何配置 H2 连接以使用特定的隔离级别,none 我对锁定模式或连接的更改帮助我摆脱了 JdbcSQLException。

H2 在多线程环境中不应该是 运行。您可以将其用于开发目的等。但在线程化、重负载环境中,您应该使用全功能 DBMS 的实例。