SQLite error: cannot start a transaction within a transaction with very basic tables

SQLite error: cannot start a transaction within a transaction with very basic tables

我是 SQL 的新手,我正在学习 SQLite 编辑器。所以我创建了几个非常简单的 tables。此代码直接来自 Linkedin 学习 "SQL essential training",我使用的是推荐的 SQLite 编辑器。

CREATE TABLE widgetInventory(
    id INTEGER PRIMARY KEY,
    description TEXT,
    onhand INTEGER NOT NULL);

CREATE TABLE widgetSales(
    id INTEGER PRIMARY KEY,
    inv_id INTEGER,
    quan INTEGER,
    price INTEGER);

然后我用一些数据更新 widgetInventory

INSERT INTO widgetInventory (description, onhand) VALUES ('rock', 25);
INSERT INTO widgetInventory (description, onhand) VALUES ('paper', 25);
INSERT INTO widgetInventory (description, onhand) VALUES ('scissors', 25);

接下来我要更新widgetSalestable有sale,更新widgetInventorytable记录onhand的减少。

BEGIN TRANSACTION;
INSERT INTO widgetSales (inv_id, quan, price) VALUES (1,5,500);
UPDATE widgetInventory SET onhand = (onhand-5) WHERE id = 1;
END TRANSACTION;

我不明白为什么当我 运行 它时会给我一个错误,因为它与课程中的完全一样。

[06:18:04] Error while executing SQL query on database 'test': cannot start a transaction within a transaction

但是,我可以 运行 INSERTUPDATE 行分开,他们会做我想让他们做的事。

在 SQLite 编辑器中,您可能需要删除或注释掉这两个事务前后的所有代码。

BEGIN TRANSACTION;
  INSERT INTO widgetSales ( inv_id, quan, price ) VALUES ( 1, 5, 500 );
  UPDATE widgetInventory SET onhand = ( onhand - 5 ) WHERE id = 1;
END TRANSACTION;

BEGIN TRANSACTION;
  INSERT INTO widgetInventory ( description, onhand ) VALUES ( 'toy', 25 );
ROLLBACK;

否则不执行交易

除此之外,可能是某处写错了。在.txt文件中复制粘贴没有出现交易错误,可以正常执行交易。

显然,运行 - 结束交易; - 在 运行 之前整个交易似乎有效。

我认为不知何故,SQL 认为交易已经发生。虽然,我不确定到底在哪里。所以要停止它,你必须先结束交易,然后再继续课程。

刚刚遇到同样的错误,我的问题是我只突出显示了第一行,因此 SQLLite 开始了事务但没有 运行 完全。我所做的只是 运行 结束事务,突出显示整个代码块并 运行 它工作正常。必须是 Lite 中的某些语法问题,运行 完整块本身。

while executing SQL query on database 'test': cannot start a transaction within a transaction means a transaction already exists. It may happen if someone forgets to select the END TRANSACTION; statement. If you face this issue just select END TRANSACTION once and run. With this it will end the active transaction and then you can run any of the existing transaction.