我有一个每秒处理许多查询的系统。我用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
确实在事务期间锁定了记录。
发布于 2014-10-23 22:15:32
我对行级锁定进行了一些研究,它可以从删除或更新中锁定记录。
更新 正式文件
在开始事务处理之后,我必须选择我想要锁定的记录,如下所示
SELECT * FROM Transaction WHERE id=1 FOR UPDATE
这样,记录将被锁定,直到transaction end
。
此方法不适用于MyISAM类型表
发布于 2014-09-25 00:50:11
我不知道您说的是哪类事务,但是在使用mysqli
扩展时,我使用以下方法来处理事务:
然后这个过程就像:
mysqli::begin_transaction
启动新事务mysqli::commit
确认第2步中的查询所做的更改,或者在执行第2步的查询时出现错误时的,使用mysqli::rollback
恢复它们所做的更改。您可以将事务视为查询的临时缓存。这在某种程度上类似于PHP中带有ob_*
函数的输出缓存。只要您没有刷新缓存的数据,屏幕上就不会发生任何事情。事务处理也是如此:只要您没有完成任何操作(并且关闭了自动提交),数据库中就不会发生任何事情。
发布于 2014-10-26 14:58:35
看起来像是种族条件的一个典型例子。您可以并行执行两个并发脚本来修改数据。可能您的第一个脚本成功地插入了记录并提交了事务,第二个脚本随后成功地删除了记录。不过,我不知道您所说的“其他用户同时在其他脚本中执行的查询”是什么意思。
https://stackoverflow.com/questions/26034102
复制