javascript – 当我使用xmlhttprequest捕获数据时,为什么我的主键会大量跳转?

编辑这个问题几乎与2010年的this question重复,除了我没有使用交易,因此没有一个答案是有道理的.

编辑我不是问如何重置主键.我问为什么主键不是由连续数字自动递增.

我正在使用xmlhttprequest来捕获您的类型信息并将其存储在我的MysqL数据库中.

HTML

<input type="text" name="example" onKeyUp="saveData(this)">

JAVASCRIPT

function saveData(a){
    var z;
    var d=new FormData();
    d.append('data',a.value);
    if(window.XMLHttpRequest){z=new XMLHttpRequest();}else{z=new ActiveXObject("Microsoft.XMLHTTP");}
    z.onreadystatechange=function(){if(z.readyState==4&&z.status==200){if(z.responseText=='false'){alert(z.responseText);}}}
    z.open("POST", '/scripts/save_data.PHP');
    z.send(d);
}

PHP
出于测试目的,我正在对uid用户ID进行硬编码.

<?PHP
$stmt=$pdo->prepare("INSERT INTO `user_data` (`uid`, `data`) VALUES (:myuid,:mydata) ON DUPLICATE KEY UPDATE `data`=values(`data`)");
$stmt->bindValue('myuid',1,PDO::ParaM_INT);
$stmt->bindParam('mydata',$_POST['data'],PDO::ParaM_STR);
$stmt->execute();

我的MysqL表有……

id, primary INT(10) unsigned auto-increment
uid, INT(10) unsigned
data, VARCHAR(24)

一切都按预期工作,但我没有看到id的值按照我预期的顺序递增(1,2,3等).它正在跳跃(1,20等),好像已创建线条,然后掉线,以形成最后一条线.谁能解释这种行为?需要我担心吗?

解决方法:

既然你澄清了,你的INSERT正在用uid创建重复的条目,这就是问题所在:

MysqL保留下一个自动增量值,并在尝试插入之前发出结束表锁定.然后插入失败并发生UPDATE部分.但是由于自动增量已经上移并且另一个进程可能已经选择了下一个数字,因此它不会再次减少.所以你得到一个洞.

当然,这一次只会产生一个“漏洞”,但由于你在密钥上这样做,它经常发生.并且由于硬编码的uid,它也发生在每个并发请求中.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...