小编典典

MySQL事务:提交和回滚

sql

我将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

阅读 266

收藏
2021-03-17

共1个答案

小编典典

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

2021-03-17