通过PHP在MySQL中实现事务

5
下面是我的问题
 $db= new mysqli('localhost','user','passcode','dbname');
try {
// First of all, let's begin a transaction
$db->beginTransaction();

// A set of queries; if one fails, an exception should be thrown
$query1="insert into table1(id,name) values('1','Dan')";
$query2="insert into table2(id,name) values('2','Anaba')";

// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();

} catch (Exception $e) {
// An exception has been thrown
// We must rollback the transaction
$db->rollback();
}

我希望通过PHP在MySQL查询中实现事务,当其中一个查询失败时,我想要所有的查询都失败。上面的代码会抛出一个错误("Fatal error: Call to undefined method mysqli::beginTransaction()")。请问是否有更好的解决方案或想法来解决这个问题。感谢您的帮助。


这与交易无关 - 但是你实际上在哪里运行这些查询?你展示的代码只是将它们分配给字符串。 - jcsanyi
我通过一个PHP脚本在浏览器中运行这些查询。 - Duahs
我的意思是 - 你展示的代码实际上并没有执行查询。 - jcsanyi
好的,请稍等,它不执行查询,而是显示上述错误消息。 - Duahs
3个回答

10

请注意,这是在使用begin_transaction()更新后出现的错误:"Fatal error: Call to undefined method mysqli::begin_transaction() in /var/www/books.php on line 19"。 - Duahs
请原谅我的错误信息,我刚从我的服务器上确认,它实际上是 PHP 5 版本。感谢您的理解。 - Duahs
在应用 $db->autocommit(true) 后,它没有抛出任何错误,但第一个查询成功了而第二个查询失败了。 - Duahs
请问我应该展示哪个代码?开始事务的正确语法是什么? - Duahs
@MarkBaker 谢谢伙计,你救了我。我只是想知道在事务中是否需要像这个链接http://php.net/manual/en/pdo.begintransaction.php中那样使用死锁预防。 - Mayank
显示剩余3条评论

2
根据文档,begin_transaction()是PHP 5.5中新推出的函数(刚在几周前发布)。
如果你遇到“不存在”的错误,那很可能是你使用的是旧版本的PHP。
如果你认为自己在运行PHP 5.5,请在同一脚本中先运行以下命令以验证你的PHP版本:
echo(phpversion());

有时候一台计算机上会安装多个PHP版本,你的脚本可能并不是在你认为的那个版本上执行。

请注意,我正在使用 PHP 5 版本。 - Duahs
PHP 5 并不一定是 PHP 5.5。PHP 5.5 只是在几周前发布的。 - jcsanyi
请注意,我已更正了之前的评论。很抱歉提供了错误的信息。我刚刚从我的服务器上验证了一下,它是 PHP 5 而不是 PHP 5.5。感谢您的理解。 - Duahs

0
你可以实现一个$count,类似这样:
$err_count = 0;
$query1 = "insert into table1(id,name) values('1','Dan')";
if(!$query1) 
    $err_count++;

if($err_count>0) 
    throw new Exception("error msg");

请注意,它完全没有响应。谢谢。 - Duahs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接