我真的没有找到正在使用MySQL事务的PHP文件的正常示例 . 你能告诉我一个简单的例子吗?
还有一个问题 . 我've already done a lot of programming and didn' t使用交易 . 我可以在 header.php
中放一个PHP函数,如果一个_656202失败,那么其他人也会失败吗?
我想我已经弄清楚了,是不是?:
mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");
if ($a1 and $a2) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
}
9 回答
我在处理事务时通常使用的想法如下(半伪代码):
请注意,有了这个想法,如果查询失败,则必须抛出异常:
PDO可以这样做,具体取决于您的配置方式
见PDO::setAttribute
和
PDO::ATTR_ERRMODE
和PDO::ERRMODE_EXCEPTION
else,使用其他API,您可能必须测试用于执行查询的函数的结果,并自己抛出异常 .
不幸的是,没有任何魔法涉及 . 您不能只是在某处放置指令并自动完成事务:您仍然必须具体必须在事务中执行哪组查询 .
例如,在事务之前(在
begin
之前)和事务之后的另外几个查询(在commit
或rollback
之后),您经常会有几个查询,并且无论发生什么事情,您都希望执行这些查询(或者不)在交易中 .我想我已经弄清楚了,是不是?:
由于这是google上“php mysql transaction”的第一个结果,我想我会添加一个明确演示如何使用mysqli进行此操作的答案(正如原作者想要的例子) . 这是PHP / mysqli事务的简化示例:
另外,请记住PHP 5.5有一个新方法mysqli::begin_transaction . 但是,PHP团队尚未对此进行记录,我对此进行了评论 .
请检查您使用的存储引擎 . 如果它是MyISAM,则不支持
Transaction('COMMIT','ROLLBACK')
,因为只有InnoDB存储引擎而不是MyISAM支持事务 .我创建了一个函数来获取查询向量并执行事务,也许有人会发现它很有用:
使用PDO连接时:
我经常使用以下代码进行事务管理:
用法示例:
这样,事务管理代码不会在整个项目中重复 . 这是一件好事,因为从这个帖子中的其他PDO相关答案判断,很容易在其中犯错误 . 最常见的是忘记重新抛出异常并在
try
块内启动事务 .我有这个,但不确定这是否正确 . 也可以尝试一下 .
来自这里的想法:http://www.phpknowhow.com/mysql/transactions/
使用
mysqli_multi_query
的另一个程序样式示例假设$query
填充了以分号分隔的语句 .