php - 记录在交易过程中被删除

标签 php mysql sql transactions table-locking

我有一个每秒处理许多查询的系统。我用 mysqlPHP 编写我的系统。

我的问题是 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 扩展,我使用以下方法处理事务:

那么流程是这样的:

  1. 使用 mysqli::begin_transaction 开始新事务
  2. 执行您的 SQL 查询
  3. 成功时使用 mysqli::commit 确认您在第 2 步中的查询所做的更改 在第 2 步中执行查询时出错使用 mysqli::rollback 还原他们所做的更改。

您可以将事务视为查询的临时缓存。它在某种程度上类似于 PHP 中带有 ob_* 函数的输出缓存。只要您没有刷新缓存数据,屏幕上就不会发生任何事情。与事务相同:只要您没有提交任何内容(并且自动提交已关闭),数据库中就不会发生任何事情。

关于php - 记录在交易过程中被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26034102/

相关文章:

sql - 如何向 "expand"当前有一个字段表示重复记录的表写入 sql 查询?

PHPMailer 字符编码问题

php - Yii - 如何访问主配置中的基本 URL

mysql - ER_ACCESS_DENIED_ERROR : Access denied for user '' @'localhost' (using password: NO)

php - 如何在具有相同名称的多行mysql中插入(订单表格数据)

mysql 查询需要 13 分钟才能运行

php - 如何按某些 id 分组并对所有行 json 编码数据求和

php - json_decode() 函数不返回任何内容

PHP 打开一个文件并给它参数/变量

php - 在 Zend_db_select 中更改表名