【问题标题】:MySQL Transaction/Commit QueryMySQL 事务/提交查询
【发布时间】:2014-07-19 07:02:03
【问题描述】:

我需要问一个简单的问题,我的 MYSQL 表正在使用 MYISAM 存储引擎,并查看了一些以前的问题,他们说在这个引擎下的查询是自动提交的(不允许事务只自动提交)。

现在,这是否意味着,如果我执行以下查询:

UPDATE `ExampleTable` SET `ExampleField` += '50' WHERE ...; 
UPDATE `ExampleTable2` SET `ExampleField2` -= '50' WHERE ...;

要么成功(并自动提交/更新两者),要么失败且都不更新?

或者我对查询的定义不正确,MYISAM 一次只会自动提交一个命令? -所以我不能在MYISAM下可靠地进行上述查询?

(额外问题)如果是这样,我听说过支持事务的 INNODB 引擎。我可以用那个代替吗?为了换取可靠的查询,我会损失多少速度?

感谢您的帮助。

【问题讨论】:

  • 基本上我要问的是:MYISAM 将自动提交的一个查询上方的代码是,还是该 SQL 被视为两个查询? (这意味着我需要一个像 INNODB 这样的事务引擎)

标签: mysql sql myisam


【解决方案1】:

基本上我要问的是:MYISAM 将自动提交一个查询上方的代码,还是将该 SQL 视为两个查询?

在 MyISAM 中,您显示的代码被视为两个查询。任何并发客户端都可以看到正在进行的数据更改。如果您希望 事务隔离 以便在您提交之前没有并发线程可以看到数据,那么您需要使用 InnoDB。

我总是推荐 InnoDB 作为 MyISAM 的默认选择。自 MySQL 5.5(大约 2010 年)以来,InnoDB 一直是默认存储引擎。

在少数情况下,MyISAM 仍然获胜,但越来越少。 InnoDB 调优后性能优于 MyISAM。甚至this blog from 2007 也显示了 InnoDB 在大多数工作负载下与 MyISAM 相当或更快的基准测试结果。此后InnoDB不断改进,而MyISAM一直停滞不前is gradually being phased out。

性能很重要,但对我来说,不破坏您的数据更为重要。 MyISAM 很容易在崩溃中丢失数据。 InnoDB 具有自动崩溃恢复功能。 MyISAM 也不支持原子更改。例如,如果您运行一个 UPDATE 需要 5 秒,然后在 2.5 秒内终止查询,则大约一半的行已更改,其余行没有更改。使用 InnoDB,这将永远不会发生。

附:运算符+= 和-= 是not supported in MySQL(我知道的任何其他SQL 数据库都不支持它们)。所以严格来说,你显示的任何查询都不会做任何事情,除了返回一个错误。

【讨论】:

    【解决方案2】:

    是的,如果你这样做是对的:

    UPDATE `ExampleTable` SET `ExampleField` += '50' WHERE ...; 
    UPDATE `ExampleTable2` SET `ExampleField2` -= '50' WHERE ...;
    

    有点像:

    START TRANSACTION;
    UPDATE `ExampleTable` SET `ExampleField` += '50' WHERE ...; 
    COMMIT;
    
    START TRANSACTION;
    UPDATE `ExampleTable2` SET `ExampleField2` -= '50' WHERE ...;
    COMMIT;
    

    所以第一个查询可能会成功执行,第二个可能会返回一些错误。

    如果您需要执行两个查询或什么都不执行,您应该选择一些支持事务的引擎(最流行的是 InnoDB)并发送:

    START TRANSACTION;
    UPDATE `ExampleTable` SET `ExampleField` += '50' WHERE ...; 
    UPDATE `ExampleTable2` SET `ExampleField2` -= '50' WHERE ...;
    COMMIT;
    

    或者另一种选择是将两个查询合并为一个,在这种情况下,您可以使用 MyISAM 引擎并且不会丢失任何数据。

    【讨论】:

      【解决方案3】:

      是的,这里有两个查询,所以它们将作为两个原子操作执行。 MyISAM 将立即提交每个查询,here is the explanation:

       In transactional terms, MyISAM tables effectively always operate in 
       autocommit = 1 mode.
      

      至于性能,INNODB 将是slower for write operations,但是你应该测试你的用例,它可能不会有很大的不同。 5.6版本有很多改进,也有一些调整可以对improve performance进行。

      【讨论】:

        猜你喜欢
        • 2017-07-26
        • 2012-05-22
        • 1970-01-01
        • 2023-03-27
        • 2012-07-02
        • 2012-12-24
        • 2013-11-22
        • 2016-10-05
        • 1970-01-01
        相关资源
        最近更新 更多