在执行 SELECT 和 INSERT 操作时,是否需要锁定 MySQL 表?

发布于 2024-11-07 18:04:24 字数 957 浏览 0 评论 0原文

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

  • 我们有一个 Web 应用程序,允许用户通过 HTML 表单向数据库添加条目
  • 用户添加的每个条目都必须有一个唯一的 URL
  • 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. INSERT 新条目,将最新条目的 url_title 字段设置为 entry_$new_id (因此表中的第 101 个条目将具有a url_title of entry_101

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

在 MyISAM 引擎上运行(如果这有影响的话)。

I'm no database guru, so I'm curious if a table lock is necessary in the following circumstance:

  • We have a web app that lets users add entries to the database via an HTML form
  • Each entry a user adds must have a unique URL
  • The URL should be generated on the fly, by pulling the most recent ID from the database, adding one, and appending it to the newly created entry
  • The app is running on ExpressionEngine (I only mention this in case it makes my situation easier to understand for those familiar with the EE platform)

Relevant DB Columns
(exp_channel_titles)

  • entry_id (primary key, auto_increment)
  • url_title (must be unique)

My Hypothetical Solution -- is table locking required here?

Let's say there are 100 entries in the table, and each entry in the table has a url_title like entry_1, entry_2, entry_3, etc., all the way to entry_100. Each time a user adds an entry, my script would do something like this:

  1. Query (SELECT) the table to determine the last entry_id and assign it to the variable $last_id
  2. Add 1 to the returned value, and assign the sum to the variable $new_id
  3. INSERT the new entry, setting the url_title field of the latest entry to entry_$new_id (the 101st entry in the table would thus have a url_title of entry_101)

Since my database knowledge is limited, I don't know if I need to worry about locking here. What if a thousand people try to add entries to the database within a 10 second period? Does MySQL automatically handle this, or do I need to lock the table while each new entry is added, to ensure each entry has the correct id?

Running on the MyISAM engine, if that makes a difference.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

多像笑话 2024-11-14 18:04:24

我认为您应该考虑以下两种方法之一:

  • 使用 AUTO_INCRMENT 列来分配 id
  • 从 MyISAM 切换到 InnoDb 存储引擎,该引擎是完全事务性的并将查询包装在事务中

I think you should look at one of two approaches:

  • Use and AUTO_INCREMENT column to assign the id
  • Switching from MyISAM to the InnoDb storage engine which is fully transactional and wrapping your queries in a transaction
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文