[英]MySQL Transaction/Commit Query
我需要问一个简单的问题,我的MYSQL表正在使用MYISAM存储引擎并查看之前的一些问题,他们说这个引擎下的查询是自动提交的(没有事务只允许自动提交)。
现在,这是否意味着,如果我执行以下查询:
UPDATE `ExampleTable` SET `ExampleField` += '50' WHERE ...;
UPDATE `ExampleTable2` SET `ExampleField2` -= '50' WHERE ...;
它会成功(并自动提交/更新两者)或失败并更新吗?
或者我的查询定义不正确,MYISAM只会立即自动提交一个命令? - 所以我不能在MYISAM下可靠地完成上述查询?
(奖金问题)如果是这样,我听说过支持交易的INNODB引擎。 我可以用它吗? 为了获得可靠的查询,我将失去多少速度?
谢谢你的帮助。
是的,如果你这样做,你是对的:
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引擎,并且不会丢失任何数据。
基本上我要问的是:MYISAM将自动提交的一个查询上面的代码,或者SQL被视为两个查询?
在MyISAM中,您显示的代码被视为两个查询。 任何并发客户端都可以看到正在更改的数据。 如果您想要事务隔离,以便在提交之前没有并发线程可以看到数据,那么您需要使用InnoDB。
我总是建议将InnoDB作为MyISAM的默认选择。 自MySQL 5.5(大约2010年)以来,InnoDB一直是默认的存储引擎。
在一些情况下,MyISAM仍然获胜,但它们越来越少。 调整好的InnoDB比MyISAM表现更好 。 即使是2007年的这篇博客也显示了基准测试结果,即在大多数工作负载下,InnoDB与MyISAM相当或更快。 从那时起,InnoDB一直在不断改进,而MyISAM一直停滞不前, 并逐渐被逐步淘汰 。
性能很重要,但对我而言, 不破坏数据更为重要。 在崩溃中,MyISAM很容易丢失数据。 InnoDB具有自动崩溃恢复功能。 MyISAM也无法支持原子变化。 例如,如果你运行一个需要5秒的UPDATE,然后2.5秒就会终止查询,大约有一半的行已被更改,其余的则没有。 使用InnoDB,这绝不会发生。
PS MySQL不支持运算符+=
和-=
它们在我知道的任何其他SQL数据库中都不受支持。 严格地说,除了返回错误之外,您显示的任何查询都不会做任何事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.