Php Mysql事务:提交和回滚
我将PhpMyAdmin数据库引擎从MyISAM更新到INNODB以允许回滚 这是我的SQL查询:Php Mysql事务:提交和回滚,php,mysql,sql,transactions,rollback,Php,Mysql,Sql,Transactions,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 WHE
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');
及
3) 如果我没弄错的话,这些函数都是一样的:
START TRANSACTION
BEGIN
BEGIN WORK
READ UNCOMMITTED
隔离级别的事务除外)不可见更新
,mysql必须对受影响的行发出独占锁,其他事务无法更新/删除这些行。如果您有一个让事务保持打开状态的应用程序,那么很可能会导致所有连接都处于繁忙状态并永远等待,或者出现一系列死锁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) 是的,这些都一样。谢谢你的帮助!谢谢你的回答。我将始终以回滚结束我的查询!
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');