【问题标题】:SQLite error: cannot start a transaction within a transaction with very basic tablesSQLite 错误:无法在具有非常基本表的事务中启动事务
【发布时间】:2020-05-07 01:00:31
【问题描述】:

我是 SQL 的新手,我正在使用 SQLite 编辑器学习。所以我创建了几个非常简单的表。这段代码直接来自Linkedin学习《SQL必备训练》,我用的是推荐的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);

接下来,我要更新widgetSales表为sale,更新widgetInventory表记录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 行,它们会做我想让它们做的事情。

【问题讨论】:

  • 无论您使用什么与数据库交互,显然都已经开始了一个事务。查看其文档,看看是否有任何方法可以改变这种行为?
  • @Shawn 我最初在BEGIN TRANSACTIOEND TRANSACTION 之间摸索了一些东西。我修复了它,再次运行它,并得到cannot start 错误。我尝试删除并重新输入表格和信息,但仍然出现错误。是挂在最初的BEGIN TRANSACTION 上吗?

标签: sqlite sqltransaction


【解决方案1】:

显然,正在运行 - END TRANSACTION; - 在运行整个事务之前似乎工作。

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

【讨论】:

    【解决方案2】:

    在 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文件中复制粘贴并没有给我那个交易错误,可以正常执行交易。

    【讨论】:

      【解决方案3】:

      刚刚遇到同样的错误,我的问题是我只突出显示了第一行,所以 SQLLite 启动了事务但没有完全运行它。我所做的只是运行结束事务,突出显示整个代码块并运行它,它运行良好。一定是 Lite 中的一些语法问题,它本身不会运行完整的块。

      【讨论】:

        【解决方案4】:

        在数据库“test”上执行 SQL 查询时:无法启动 交易中的交易 表示交易已经存在。如果有人忘记选择END TRANSACTION; 语句,可能会发生这种情况。 如果您遇到此问题,只需选择一次END TRANSACTION 并运行。这样它将结束活动事务,然后您可以运行任何现有事务。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-29
          • 1970-01-01
          • 2011-12-13
          • 2017-01-31
          • 2021-01-18
          • 2014-07-09
          • 1970-01-01
          相关资源
          最近更新 更多