2

我有两个运行 Ruby on Rails 的应用程序服务器共享同一个 MySQL 数据库服务器,使用 InnoDB 引擎。

有时在重负载下,我发现记录中的 ID 在表用户、X 和 Y 中被跳过并且不是连续的。

这是伪代码:

user = Create user x in table Users

user_x = Find user x

Insert a tuple into an auxiliary table X

Insert a tuple into an auxiliary table Y

Update the tuple that was inserted in table X

Insert a tuple into an auxiliary table Z

表 X、Y、Z 都以某种方式相关,我不会删除任何记录。

但是,我发现有时记录 ID 在重载期间会跳过一两个。

交易对这种情况有帮助吗?

Start transaction

  user = Create user x

  user_x = Find user x

  Insert a tuple into an auxiliary table X

  Insert a tuple into an auxiliary table Y

  Update the tuple that was inserted in table X

  Insert a tuple into an auxiliary table Z

Commit

Noobie 问题,此代码在没有负载时工作正常,但如果有负载则一次。即多个用户在完全相同的时间点击相同的资源,然后发生上述情况。交易会有帮助吗?

将所有内容包装在事务块中会有什么缺点?

4

1 回答 1

2

我不确定 MYSQL,但在 Postgres 中,id 仅从自动递增序列中分配一次,如果事务回滚或中止,则将不使用。

你最好看看为什么跳过一些 id 是个问题。任何依赖它们顺序的东西都是可疑的。

您是否在用户与表 X、Y 和 Z 之间使用外键?或者这种关系是否依赖于并行递增的 id?

于 2012-10-14T00:31:55.560 回答