加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – mysql提交和事务

发布时间:2020-12-13 18:22:11 所属栏目:PHP教程 来源:网络整理
导读:我有一个关于 mysql提交和事务的问题. 我有几个执行mysql查询的php语句. 我只想说以下内容吗? mysql_query("START TRANSACTION");//more queries heremysql_query("COMMIT"); 这到底是做什么的?它有什么用?对于更新,删除和插入,我还发现这可以阻止其他查
我有一个关于 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");

这会阻止任何性质的其他查询或只写/选择吗?

另一个问题:假设一个查询正在运行并阻止其他查询.另一个查询尝试访问被阻止的数据 – 并且它看到它被阻止.它是如何进行的?是否等到数据再次被解除阻塞并重新执行查询?它是否会失败并需要重复?如果是这样,我该怎么检查?

非常感谢!

丹尼斯

在InnoDB中,如果尚未更改autocommit的默认设置(“on”),则无需为单个查询显式启动或结束事务.如果启用了自动提交,InnoDB会自动封闭事务中的每个SQL查询,这相当于START TRANSACTION;查询;承诺;.

如果在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;

这可确保两个查询都能成功运行,或者不运行,但不能只运行一个查询.
当您应该使用交易时,This post还有更多内容.

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

您可以阅读有关InnoDB交易here的更多信息.有关死锁的问题,请参阅文档的第14.2.8.8和14.2.8.9节.如果查询失败,您的MySQL驱动程序将返回一条错误消息,指出原因;如果需要,您的应用应该重新发出查询.

最后,在您的示例代码中,您使用了mysql_query.如果您正在编写新代码,请停止使用旧的,缓慢的,已弃用的PHP mysql_库并使用mysqli_或PDO代替:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读