我的应用程序在注册新客户然后将其插入客户表时生成ID号。
生成ID的方法是读取最后一个ID号,然后将其递增1,然后将其插入表中。
该应用程序将在具有30个以上用户的网络环境中使用,因此至少有两个用户有可能(概率?)在保存阶段读取相同的最后一个ID号,这意味着两者都将获得相同的身份证号码。
我也在使用交易。我需要一个在其他网站上找不到的逻辑解决方案。
请回复说明,以便我能理解它。
答案 0 :(得分:2)
使用自动增量,你可以获得mysql_insert_id属性发出的最后一个id。
如果由于某种原因这是不可行的,你可以让另一个表保持最后使用的id,然后在事务中递增它,然后将其用作插入表中的键。但是要进行两次转换,否则你将遇到同样的问题。这可能会变得混乱,但是这是一个额外的维护水平。 (将你的下一个id表重置为零,当它们仍然存在于相关的表格中时,事情就会迅速发展。
在插入操作期间(甚至没有稍微推荐),在桌子上放置一个独占锁定,你当前的解决方案就无法工作了。
好的,基于离开架构的扩展答案。
伪代码中的选项1
StartTransaction
try
NextId = GetNextId(...)
AddRecord(NextID...)
commit transaction
catch Primary Key Violation
rollback transaction
Do the entire thing again
end
显然你可能会在这里结束一个无限循环,不太可能,但可能,可能首先耗尽堆栈空间。
如果成功从队列中删除,您可以对请求进行排队,然后尝试处理这些请求。
但是让customerid成为一个汽车公司,整个问题都会出现问题。 它仍然是主键,你只需要解决它需要的东西,实际上你不会在insert语句中提供它,mysql会为你处理它。
您唯一需要记住的是,如果您需要自动创建的ID是在一次交易中请求它。
因此您的插入查询需要采用
形式Insert SomeTable(SomeColumns) Values(SomeValues)
Select mysql_insert_id
或者如果多个语句妨碍了在start stransaction commit transaction对中包含两个语句。