フィールドuser
を持つlastusedecnumber
テーブルがあります。
lastusedecnumber
にアクセスしてインクリメントする必要があります。
そのアクセス時間中に、特定のユーザー行(テーブル全体ではなく)をロックする必要があります。
どうすればよいですか?
テーブルのタイプはMyISAM
です。
MySQLはMyISAMテーブルからのテーブルレベルのロックのみを使用します。可能であれば、行レベルのロックのためにInnoDBに切り替えます。
これは、MySQLサイトへのリンクで、InnoDBテーブルのSQLステートメントによって設定されるロックについて説明しています。 http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html
ちょっと最近ですが、誰かに役立つことを願っています:
_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
に設定します。素敵ではありませんが、本当に簡単な回避策です。
データベース全体をmyisamから変換したくありませんでした。したがって、ロックするレコードのIDに基づいて名前が付けられた新しいテーブルを作成しようとします。テーブルの作成が成功した場合は、作業を行い、最後にテーブルを削除します。テーブルの作成が失敗した場合は、停止します。