May 25, 2012

MySQL アトミックオペレーション


昨日の
「RDBでレコードロックしなくともうまく排他制御できる場合がある」
の記事に補足します。

「レコードロック排他制御の必要はなくなる」
と書きましたが、
念のため補足しますと、
「MySQLのMyISAM形式のテーブルでの話し」
ということです。
------------------------------------------------------

私が、いろいろやって来た経験で、
自分で発見したつもりでいましたが、
検索をすると
MySQLの最新日本語マニュアルの

1.8.5.3. トランザクションとアトミックオペレーション

に似たような話(そしてさらに詳しい話)があります。

---------------------------------------------------

MySQLの最新日本語マニュアルは、
内容が難しく、しかも翻訳なので、
私には意味がとりにくいのですが
多分昨日の記事の方法が正しいという意味が
書いてあると思います。

------------------------------------------------------
MySQLの最新日本語マニュアルの
「アトミックな更新」という意味について
説明がなく、なかなか理解ができないのですが、、、

プログラミングの技術としては、

アトミック = アトム(原子) + ミック(のような)

ということで、
マルチタスク環境でも、
原子のようにこれ以上分解されないひとつのかたまりとして
処理される単位の更新処理という意味と推測しています。
---------------------------------------------------

MySQLには、「InnoDBトランザクション・ストレージ・エンジン」という物もあり
これは、高機能(トランザクション、つまり、ROLLBACK をサポート)だけども遅いそうです。

MySQLでは、非トランザクション・ストレージ・エンジン(MyISAM など)を
使うことが一般的です。

「MyISAM テーブルは事実上、常に AUTOCOMMIT=1モードで動作する」そうです。
これは、「INSERT, UPDATE, DELETE は、常にその場で処理が完了(COMMIT)される」
という意味です。

---------------------------------------------------
でも、注意が必要なことがあります。
私が主張する方法(昨日の記事)は、適用範囲があり
万能ではないということです。

私の過去の経験では、ROLLBACKが必要なようなことは幸い無かったのです。

多分、
- ROLLBACKを使わなくともよいように、整合性の取れた美しいテーブル設計であった。
- ROLLBACKが始めからないMyISAMを使っている。
- LOCK TABLES を極力回避できるようにシンプルさを維持する工夫をしてきた。
などが、原因と思います。

でも逆の見方をすると、
ただ単に、簡単なアプリしか組んでいないという
意味かもしれません。

---------------------------------------------------

では、これにて失礼します。