Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql事务:提交和回滚_Php_Mysql_Sql_Transactions_Rollback - Fatal编程技术网

Php Mysql事务:提交和回滚

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

我将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');

3) 如果我没弄错的话,这些函数都是一样的:

START TRANSACTION
BEGIN
BEGIN WORK
  • 在提交事务之前,您在一个事务中所做的更改对其他事务(具有
    READ UNCOMMITTED
    隔离级别的事务除外)不可见

  • 回滚事务和保持它永远打开(或者直到引擎因超时而终止)之间有着巨大的区别。后者意味着服务器无法释放为支持事务而分配的资源。此外,由于您执行
    更新
    ,mysql必须对受影响的行发出独占锁,其他事务无法更新/删除这些行。如果您有一个让事务保持打开状态的应用程序,那么很可能会导致所有连接都处于繁忙状态并永远等待,或者出现一系列死锁

  • 是的,它们都在mysql中启动一个新事务

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

    谢谢你的帮助!谢谢你的回答。我将始终以回滚结束我的查询!
    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');