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更改将是永久性的)。

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
4

2 回答 2

11

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) 是的,这些都是一样的。

于 2013-11-10T15:01:03.750 回答
4
  1. 在提交事务之前,您在一个事务中所做的更改对其他事务(具有READ UNCOMMITTED隔离级别的事务除外)是不可见的。

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

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

于 2013-11-10T14:59:00.060 回答