我的一个访问问题,如果世界各地的多个用户正在访问该应用程序,其中它使用一个主键为自动增量字段的表。
问题如何阻止其他用户在执行其他用户时获取相同的主键?
我的回答是我将获得表上的锁定,我将让用户等待,直到该用户被主键释放。
但问题
请建议上述问题的可能答案
答案 0 :(得分:4)
只要您正确使用,自动增量主键永远不会为两个用户提供相同的值。这是因为根据定义,主键包含唯一性约束。
要正确使用它,请先插入行,然后再获取最后插入行的ID。例如,在MySQL的文档中有关于它的whole page。在MySQL中,您可以使用LAST_INSERT_ID()
或mysql_insert_id()
来获取最后插入行的ID。
糟糕的方法是先插入行,然后在表中查询MAX(id)
。
如果您使用此方法,则不需要锁定。使用表锁会降低应用程序的速度,如果可能的话应该避免使用它。
答案 1 :(得分:0)
在使用JDBC进行数据访问的Java中,您可以在执行INSERT的语句上调用Statement.getGeneratedKeys()。
编辑:我刚刚重新阅读了您的问题。使用自动增量字段,数据库决定插入时的值。它管理锁定表并确保唯一性 - 使用标识列的原因之一比使用MAX(id)+1攻击您自己的身份密钥管理要好得多。答案 2 :(得分:0)
继Marks帖子之后,在SQL Server中,您应该使用Scope_Identity()
来检索该会话中创建的最后一个ID。
此外,您可以实现隔离级别来配置SQL Server在事务期间读/写表的方式。可以找到有关隔离级别的信息here