我在处理事务时通常使用的想法如下(半伪代码):
try {
// First of all, let\'s begin a transaction
$db->beginTransaction();
// A set of queries; if one fails, an exception should be thrown
$db->query(\'first query\');
$db->query(\'second query\');
$db->query(\'third query\');
// 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();
}
请注意,有了这个想法,如果查询失败,则必须抛出异常:
- PDO可以这样做,具体取决于您的配置方式
- 看到
PDO::setAttribute - 并
PDO::ATTR_ERRMODE与PDO::ERRMODE_EXCEPTION
- 看到
- 否则,使用其他API,您可能必须测试用于执行查询的函数的结果,并自己抛出异常。
不幸的是,没有任何魔法涉及。您不能只是在某处放置指令并自动完成事务:您仍然必须具体必须在事务中执行哪组查询。
例如,通常在事务之前(在之前begin)和事务之后的另外几个查询(在commit或之后rollback)会有几个查询,并且无论发生了什么(或不发生),您都希望执行这些查询
再来一个php+mysql事物实例:
<?php
// trans.php
function begin(){
mysql_query(\"BEGIN\");
}
function commit(){
mysql_query(\"COMMIT\");
}
function rollback(){
mysql_query(\"ROLLBACK\");
}
mysql_connect(\"localhost\",\"Dude1\", \"SuperSecret\") or die(mysql_error());
mysql_select_db(\"bedrock\") or die(mysql_error());
$query = \"INSERT INTO employee (ssn,name,phone) values (\'123-45-6789\',\'Matt\',\'1-800-555-1212\')\";
begin(); // transaction begins
$result = mysql_query($query);
if(!$result){
rollback(); // transaction rolls back
echo \"transaction rolled back\";
exit;
}else{
commit(); // transaction is committed
echo \"Data transaction was successful\";
}
?>
继续阅读与本文标签相同的文章
-
“管道机器人”高清成像准确反映管道问题
2026-05-15栏目: 教程
-
叮咚,你的开票机器人上线啦!
2026-05-15栏目: 教程
-
4G时代中国建了440万座基站,5G时代建多少,数量估计超过你想象
2026-05-15栏目: 教程
-
中国电子商会组织中国企业团赴拉斯维加斯消费电子展参观的通知
2026-05-15栏目: 教程
-
携多款商用产品现身ISMAR,虹软推进AR应用规模化落地
2026-05-15栏目: 教程
