我有一个每秒处理许多查询的系统。我用 mysql
和 PHP
编写我的系统。
我的问题是 mysqli 事务仍然提交事务,即使记录被其他用户同时删除,我所有的表都使用 InnoDB
。
这就是我使用 mysqli 编写交易代码的方式:
mysqli_autocommit($dbc,FALSE);
$all_query_ok=true;
$q="INSERT INTO Transaction() VALUES()";
mysqli_query ($dbc,$q)?null:$all_query_ok=false;
$q="INSERT INTO Statement() VALUES()";
mysqli_query ($dbc,$q)?null:$all_query_ok=false;
if($all_query_ok==true){
//all success
mysqli_commit($dbc);
}else{
//one of it failed , rollback everything.
mysqli_rollback($dbc);
}
下面是另一个用户在其他脚本中同时执行的查询,然后最终搞乱了预期的系统行为,
$q="DELETE FROM Transaction...";
mysqli_query ($dbc,$q)?null:$all_query_ok=false;
请指教,我是不是执行错了交易?我已阅读有关行级锁定的内容,并相信 innoDB
确实会在事务期间锁定记录
最佳答案
我不知道你说的是哪一种事务,但是使用 mysqli
扩展,我使用以下方法处理事务:
那么流程是这样的:
- 使用
mysqli::begin_transaction
开始新事务 - 执行您的 SQL 查询
- 成功时使用
mysqli::commit
确认您在第 2 步中的查询所做的更改或 在第 2 步中执行查询时出错使用mysqli::rollback
还原他们所做的更改。
您可以将事务视为查询的临时缓存。它在某种程度上类似于 PHP 中带有 ob_*
函数的输出缓存。只要您没有刷新缓存数据,屏幕上就不会发生任何事情。与事务相同:只要您没有提交任何内容(并且自动提交已关闭),数据库中就不会发生任何事情。
关于php - 记录在交易过程中被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26034102/