在执行 SELECT 和 INSERT 操作时,是否需要锁定 MySQL 表?
我不是数据库专家,所以我很好奇在以下情况下是否需要表锁:
- 我们有一个 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。每次用户添加条目时,我的脚本都会执行如下操作:
- 查询(SELECT)表以确定最后一个entry_id并将其分配给变量$last_id
- 将1添加到返回值,然后将总和分配给变量 $new_id
- 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:
- Query (SELECT) the table to determine the last entry_id and assign it to the variable $last_id
- Add 1 to the returned value, and assign the sum to the variable $new_id
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为您应该考虑以下两种方法之一:
I think you should look at one of two approaches:
AUTO_INCREMENT
column to assign the id