2

InnoDBエンジンを使用して、同じMySQLデータベースサーバーを共有するRubyonRailsを実行している2つのアプリケーションサーバーがあります。

負荷が高い場合、レコードのIDがUsers、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が1つまたは2つスキップすることがあります。

トランザクションはこの場合に役立ちますか?

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の質問ですが、このコードは負荷がない場合は正常に機能しますが、負荷がある場合は1回だけ機能します。つまり、複数のユーザーがまったく同時に同じリソースにアクセスすると、上記のことが起こります。取引は役に立ちますか?

すべてをトランザクションブロックでラップすることにはどのような欠点がありますか?

4

1 に答える 1

2

MYSQLについてはよくわかりませんが、PostgresではIDは自動インクリメントシーケンスから一度だけ割り当てられ、トランザクションがロールバックまたは中止された場合は使用されません。

一部のIDがスキップされることが問題である理由を確認するのが最善です。それらがシーケンシャルであることに依存しているものはすべて疑わしいです。

ユーザーとテーブルX、Y、Zの間で外部キーを使用していますか?または、関係はIDが並行して増加することに依存しますか?

于 2012-10-14T00:31:55.560 に答える