繁体   English   中英

Mysql事务:提交和回滚

[英]Mysql transaction : commit and rollback

我将我的PhpMyAdmin数据库引擎从MyISAM更新到INNODB以允许回滚。

这是我的SQL查询:

START TRANSACTION;
UPDATE jkm_content SET state=0 WHERE title IN ('title-1','title2');

结果如下:

start transaction;# MySQL returned an empty result set (i.e. zero
rows).
UPDATE jkm_content SET state=1 WHERE title IN ('title-1','title2');# 2 rows affected.

1)因此该声明通知我2行受到影响,但更改不会出现在任何地方(我的数据库或网站中都没有)。我虽然start transaction将允许我可视化更改(在临时数据库中)然后如果我满意,我“提交”查询。 (我知道我需要commit更新数据库,但如果我commit更改将是永久性的)。

2)如果我在提交之前看不到效果,那么我就没有得到rollback的意义。 这两个查询之间的区别是什么:

START TRANSACTION;
UPDATE jkm_content SET state=0 WHERE title IN ('title-1','title2');

START TRANSACTION;
UPDATE jkm_content SET state=0 WHERE title IN ('title-1','title2');
ROLLBACK;

3)如果我做对了,这些功能都是一样的:

START TRANSACTION
BEGIN
BEGIN WORK

1)您所做的所有更改都在同一事务中可见。 如果你这样做

START TRANSACTION;
INSERT INTO MyTable VALUES ('Hi there');
SELECT * FROM MyTable;

你的输出将包括'你好'。 但是,如果启动第二个数据库连接,则在第一个连接中提交事务之前,不会显示新行。 尝试使用命令行使用两个数据库连接来玩这个。

您没有在您的网站中看到效果,因为您无法在两个数据库连接中拥有相同的事务(将在您的请求开始时建立新的数据库连接)。

2)当与数据库的连接关闭时,将回滚所有未提交的事务。 因此,如果这些是您唯一的两个查询,则没有区别。 然而,两者之间存在差异

START TRANSACTION;
INSERT INTO MyTable VALUES ('This one would be discarded on rollback');
ROLLBACK;
INSERT INTO MyTable VALUES ('This one will be permanent because not within transaction');  

3)是的,这些都是一样的。

  1. 在事务READ UNCOMMITTED之前,您在一个事务中所做的更改对其他事务(具有READ UNCOMMITTED隔离级别的事务除外)不可见。

  2. 回滚事务和永久保持打开(或直到引擎因超时而终止它)之间存在巨大差异。 后者意味着服务器无法释放分配用于支持事务的资源。 此外,由于您执行UPDATE ,因此mysql必须对受影响的行发出独占锁,并且没有其他事务可以更新/删除这些行。 如果你有一个让事务处于打开状态的应用程序,你很可能最终会遇到所有连接繁忙并且永远等待,或者一堆死锁。

  3. 是的,他们都在mysql中启动一个新事务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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