Mysql事务:提交和回滚

5

我将我的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来更新数据库,但是一旦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
2个回答

11

1) 所有您所做的更改都会在同一事务中显示。如果您执行

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

你的输出将包括“Hi there”。但是,如果你启动第二个数据库连接,则新行在你从第一个连接中提交事务之前不会显示。尝试使用命令行使用两个数据库连接进行操作。

你在网站上看不到效果,因为你不能在两个数据库连接中具有相同的事务(在请求开始时将建立新的数据库连接)。

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) 是的,它们都是相同的。


感谢您的帮助! - JinSnow

4
  1. 在同一事务中所做的更改对其他事务(除了使用READ UNCOMMITTED隔离级别的事务)不可见,直到该事务提交。

  2. 回滚事务和将其保持打开是有很大区别的(或者直到引擎因超时而终止它)。后者意味着服务器无法释放为支持事务分配的资源。此外,由于您执行UPDATE操作,mysql必须在受影响行上发出独占锁,而没有其他事务可以更新/删除这些行。如果您的应用程序使事务保持打开状态,则很可能最终所有连接都会忙于等待,或者出现大量死锁。

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


谢谢你的回答。我以后查询时会加上回滚操作! - JinSnow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接