在执行SELECT后跟INSERT时是否需要锁定MySQL表?

时间:2011-05-13 16:18:24

标签: mysql locking expressionengine

我不是数据库大师,所以我很好奇在以下情况下是否需要表锁:

  • 我们有一个网络应用程序,允许用户通过HTML表单向数据库添加条目
  • 用户添加的每个条目都必须具有唯一的网址
  • 应该动态生成URL,方法是从数据库中提取最新的ID,添加一个,然后将其附加到新创建的条目
  • 该应用程序正在ExpressionEngine上运行(我只提到这个,以防对熟悉EE平台的人更容易理解)

相关数据库列 (exp_channel_titles)

  • entry_id(主键,auto_increment)
  • url_title(必须是唯一的)

我的假设解决方案 - 这里需要表锁定吗?

假设表中有100个条目,表中的每个条目都有一个url_title,如entry_1,entry_2,entry_3等,一直到entry_100。每次用户添加条目时,我的脚本都会执行以下操作:

  1. 查询(SELECT)表以确定最后一个entry_id并将其分配给变量 $ last_id
  2. 将1添加到返回值,并将总和分配给变量 $ new_id
  3. 插入新条目,将最新条目的url_title字段设置为 entry_ $ new_id (表格中的第101条条目将具有 entry_101 的url_title)< / LI>

    由于我的数据库知识有限,我不知道是否需要担心锁定。如果有一千人试图在10秒内向数据库添加条目会怎样? MySQL会自动处理这个问题,还是在添加每个新条目时需要锁定表格,以确保每个条目都有正确的ID?

    在MyISAM引擎上运行,如果这有所不同。

1 个答案:

答案 0 :(得分:1)

我认为你应该看看以下两种方法之一:

  • 使用和AUTO_INCREMENT列分配ID
  • 从MyISAM切换到完全交易的InnoDb存储引擎,并将您的查询包装在交易中