获取数据库中的表锁 - 访谈问题

时间:2010-04-27 06:28:09

标签: java php mysql

我的一个访问问题,如果世界各地的多个用户正在访问该应用程序,其中它使用一个主键为自动增量字段的表。

问题如何阻止其他用户在执行其他用户时获取相同的主键?

我的回答是我将获得表上的锁定,我将让用户等待,直到该用户被主键释放。

但问题

  1. 如何以编程方式获取Table锁并实现它?
  2. 如果每分钟都有1000个用户来到应用程序,如果您明确地保持对表的锁定,那么应用程序将变慢?你是如何管理的?
  3. 请建议上述问题的可能答案

3 个答案:

答案 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