我对 Vertica 数据库运行以下语句,一次一个:
BEGIN TRANSACTION;
UPDATE table
SET col1 = 'something'
WHERE col2 = 'something else';
SELECT COUNT(*)
FROM table
WHERE col1 = 'something';
ROLLBACK TRANSACTION;
我运行第一行很好......好吧,现在我正在进行交易。
我运行我的更新......好吧,这工作。
我运行SELECT
测试以确保事情按预期工作......哦,等等,看起来我错过了语句WHERE
子句中的一个条件UPDATE
。
不用担心!这就是我在交易中这样做的原因。
让我们回滚:
=> ROLLBACK TRANSACTION;
[Vertica][JDBC](10040) Cannot use commit while Connection is in auto-commit mode.
琼斯,把你桌上的那卷卫生纸交出来。
所以 Vertica 很高兴地接受了我的BEGIN TRANSACTION
,因为我非常清楚,在那之后我会尝试运行 aROLLBACK
或COMMIT
.
然而,我做不到!我的连接处于自动提交模式,因此ROLLBACK
毫无COMMIT
意义。我UPDATE
的承诺在它完成的那一刻。
我错过了什么,还是我认为这只是 Vertica 的一个非常糟糕的实现?
如果逻辑结果 (或) 是非法的,为什么 Vertica 会BEGIN TRANSACTION
在自动提交模式下接受连接?ROLLBACK
COMMIT
Vertica(实际上,我认为如果不是所有数据库的话,大多数数据库)都以这种方式运行,因为处理
BEGIN TRANSACTION
SQL 语句的部分,即查询解析和执行引擎,不知道客户端的 AUTOCOMMIT 设置。另一方面,客户端不知道字符串“BEGIN TRANSACTION”的含义。vsql
假设使用命令行客户端运行示例,控制流看起来像这样:vsql
并连接到数据库。\set AUTOCOMMIT on
。在那一刻之后,客户端 ( ) 知道在每个成功的语句之后vsql
发出一个隐式语句。COMMIT
BEGIN TRANSACTION
。vsql
不将该字符串识别为其内部命令之一,并将该字符串发送到服务器进行处理。COMMIT
向服务器发出问题。等等
Vertica 支持已确认此问题,并正在跟踪 VER-44735 下的修复。不幸的是,Vertica 问题跟踪器不公开可见。
Vertica 拒绝将此描述为错误,而是将其标记为“新功能请求”,但无论如何这应该在即将发布的版本中解决。