繁体   English   中英

MySQL事务/提交查询

[英]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将立即提交每个查询, 这里是解释

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

至于性能,INNODB 的写入操作慢一些 ,但是你应该测试你的用例,它可能没有太大的区别。 5.6版本有许多改进,还有一些调整可以帮助您提高性能

基本上我要问的是: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM