MySQL事务/提交查询

时间:2014-05-29 17:11:01

标签: mysql sql myisam

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

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

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

它会成功(并自动提交/更新两者)还是失败并且不更新?

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

(奖金问题)如果是这样,我听说过支持交易的INNODB引擎。我可以用它吗?为了获得可靠的查询,我将失去多少速度?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

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

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引擎,并且不会丢失任何数据。

答案 1 :(得分:1)

是的,这里有两个查询,因此它们将作为两个原子操作执行。 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进行一些调整。

答案 2 :(得分: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也无法支持原子变化。例如,如果你运行一个需要5秒的UPDATE,然后2.5秒就会终止查询,大约有一半的行已被更改,其余的则没有。使用InnoDB,这绝不会发生。

P.S。运算符+=-=not supported in MySQL(在我知道的任何其他SQL数据库中都不支持它们)。严格地说,除非返回错误,否则您显示的任何查询都不会做任何事情。