web-dev-qa-db-ja.com

単一の行をロックする方法

フィールドuserを持つlastusedecnumberテーブルがあります。

lastusedecnumberにアクセスしてインクリメントする必要があります。

そのアクセス時間中に、特定のユーザー行(テーブル全体ではなく)をロックする必要があります。

どうすればよいですか?

テーブルのタイプはMyISAMです。

22
svk

MySQLはMyISAMテーブルからのテーブルレベルのロックのみを使用します。可能であれば、行レベルのロックのためにInnoDBに切り替えます。

これは、MySQLサイトへのリンクで、InnoDBテーブルのSQLステートメントによって設定されるロックについて説明しています。 http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html

24
belwood

ちょっと最近ですが、誰かに役立つことを願っています:

_UPDATE user SET lastusedecnumber = LAST_INSERT_ID(lastusedecnumber + 1);
SELECT LAST_INSERT_ID();
_

Lastusedecnumberのアトミックな増分と、SELECT LAST_INSERT_ID()を使用してlastusedecnumberフィールドの新しい値(増分後)を読み取る機能を提供します。

回避策として、locked TINYINT(1)のようにテーブルに列を追加することができます。行をロックする場合は常に1に設定します。この行にアクセスしようとすると、最初に行うことは、lockedフィールドが設定されているかどうかを確認することです。

行のロックを解除するには、再度0に設定します。素敵ではありませんが、本当に簡単な回避策です。

1
dhh

データベース全体をmyisamから変換したくありませんでした。したがって、ロックするレコードのIDに基づいて名前が付けられた新しいテーブルを作成しようとします。テーブルの作成が成功した場合は、作業を行い、最後にテーブルを削除します。テーブルの作成が失敗した場合は、停止します。

0
oyvey