我将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进行更改,则该更改将是永久的)。
start transaction
commit
2)然后我不明白rollback在提交之前看不到效果的意思。这两个查询之间有什么区别:
rollback
和
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;
您的输出将包括“ 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)是的,这些都是一样的。