Vertx PostgreSQL 事务

Vertx PostgreSQL Transactions

我正在尝试做一个简单的 SQL 交易,但不幸的是我无法让它正常工作。

我现在在做什么:

protected Single<SQLConnection> tx() {
  return PostgreSQLClient.createShared(getVertx(), SqlUtil.getConnectionData())
    .rxGetConnection().map((SQLConnection conn) -> {
 
    conn.rxSetAutoCommit(false);

    return conn;
  });
}

根据我阅读文档的理解,这应该足够了吗?

当我检查 conn 时,我看到:

inTransaction = false

isAutoCommit = true

为什么会这样,我做错了什么?

--

我使用常见的 sql 驱动程序 (http://vertx.io/docs/vertx-sql-common) 和 vertx 3.4.1

您看到的是连接的内部状态。当前的实现使用 2 个标志控制事务性:

  • 在交易中
  • 是自动提交

调用方法后最后一个翻转:

conn.rxSetAutoCommit(false);

但这在内部作为 NOOP 处理。只有当调用之后事务才会启动,第一个flag才会改变。

请记住,这是客户端的内部状态,并且 can/will 将来会在异步驱动程序中实施适当的事务隔离级别时发生变化,其中已经存在未决 pull request

如果你想看到它工作,基本上在你的代码中发出一个 SQL 语句,例如:

conn.rxSetAutoCommit(false).rxExecute("SELECT ...")

如果您再次检查,您会发现这两个标志现在都为真,而且您的服务器上有一个 运行 事务。