Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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_Transactions_Commit - Fatal编程技术网

Php MySQL提交和事务

Php MySQL提交和事务,php,mysql,transactions,commit,Php,Mysql,Transactions,Commit,我有一个关于MySQL提交和事务的问题。我有两个执行MySQL查询的PHP语句。我只是说以下几点吗 mysql_query("START TRANSACTION"); //more queries here mysql_query("COMMIT"); 这到底能做什么?这有什么帮助?对于更新、删除和插入,我还发现这会阻止其他查询读取: mysql_query("LOCK TABLES t1 WRITE, t2 WRITE"); //m

我有一个关于MySQL提交和事务的问题。我有两个执行MySQL查询的PHP语句。我只是说以下几点吗

mysql_query("START TRANSACTION");
//more queries here
mysql_query("COMMIT");
这到底能做什么?这有什么帮助?对于更新、删除和插入,我还发现这会阻止其他查询读取:

mysql_query("LOCK TABLES t1 WRITE, t2 WRITE");
//more queries here
mysql_query("UNLOCK TABLES t1, t2");
这会阻止其他任何性质的查询还是只写/选择

另一个问题:假设一个查询正在运行,并阻止其他查询。另一个查询试图访问被阻止的数据,它看到它被阻止了。如何进行?它是否会等到数据再次被解锁后再重新执行查询?它只是失败了,需要重复吗?如果是,我如何检查

非常感谢


Dennis

在InnoDB中,如果未更改自动提交的默认设置(即“打开”),则无需为单个查询显式启动或结束事务。如果启用自动提交,InnoDB会自动将每个SQL查询封装在事务中,这相当于
启动事务;查询承诺

如果您在InnoDB中显式使用了启用自动提交的
START TRANSACTION
,则在
START TRANSACTION
语句之后执行的任何查询要么全部执行,要么全部失败。这在银行环境中很有用,例如:如果我要将500美元转账到您的银行帐户,则只有从我的银行余额中减去该金额并将其添加到您的银行账户中,该操作才会成功。所以在这种情况下,你会运行类似

START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;
这可以确保两个查询都将成功运行,或者不运行,但不只是一个查询。 有更多关于何时应该使用事务的信息

在InnoDB中,很少需要锁定整个表;与MyISAM不同,InnoDB支持行级锁定。这意味着客户端不必锁定整个表,从而迫使其他客户端等待。客户端应该只锁定他们实际需要的行,允许其他客户端继续访问他们需要的行

您可以阅读有关InnoDB事务的更多信息。您关于死锁的问题将在文档的章节和中得到解答。如果查询失败,您的MySQL驱动程序将返回一条错误消息,指出原因;如果需要,您的应用程序应该重新发出查询


最后,在示例代码中,使用了
mysql\u查询
。如果您正在编写新代码,请停止使用旧的、速度慢的、不推荐使用的
mysql\uquot/code>PHP库,改用
mysqli\uquot/code>或PDO:)

您在使用InnoDB或MyISAM表吗?太棒了,谢谢!那么InnoDB是否只自动锁定行?如何检查我的表是否启用了自动提交?如何在上面设置索引(我使用的是phpmyadmin)。您可以发出
显示变量,如“autocommit”
查询,或者单击phpmyadmin主页上的
变量。创建索引的方法是转到Approviat数据库和表,单击
structure
,然后使用您在那里看到的表单创建索引。或者您可以发出SQL语句,例如,
altertabletaddindex(field)
。我不知道你所说的“InnoBD是否只自动锁定行”是什么意思——如果你是这个意思的话,它肯定不会自动锁定整个表:)Autocommit打开:)主键总是用作索引吗?我的表中有主键,希望添加一个索引,但它说它只能与主键相同……是的,主键用作索引:)From:要隐式禁用单个语句系列的自动提交模式,请使用START TRANSACTION语句。使用START TRANSACTION,自动提交将保持禁用状态,直到您使用提交或回滚结束事务。然后,自动提交模式将恢复到以前的状态。