WEBアプリ上の、MySQLのトランザクションについて質問です。
トランザクションは、データの挿入に矛盾がない場合commitすることによって
データの挿入等を確定する機構だとおもいますが、
この仕組みって、トランザクション中は作業対象のテーブルは実行中のクライアント以外
アクセスできなくなる(※つまりロック?がかかっている?)のでしょうか?
そうじゃないと、意味がないですよね?やっぱり。。。
また仮にですが、例えばAというクライアントがWEBサイトにアクセス中に
Bというクライアントが待ったく 同じ動作を同じタイミングでアクセスした場合ってどうなるのでしょうか?
実際、WEBアプリでそこまでの例外というか処理って行うものでしょうか?
また、ちなみにMySQLの場合、 "START TRANSACTION" というSQL文だけでなく
AUTOCOMMIT = 0 として、自動コミットをオフにしつつ beginという式で
トランザクションを開始する方法があるようですが、実際はどちらの方が当たり前のほうほうなのでしょうか?
識者の方ご教授ください。
No.2ベストアンサー
- 回答日時:
こんにちは。
> この仕組みって、トランザクション中は作業対象のテーブルは実行中のクライ
> アント以外アクセスできなくなる(※つまりロック?がかかっている?)のでしょうか?
MySQLにおいて、トランザクションが有効になるのはInnoDBエンジンを利用した場合であることはよろしいですよね?最新のバージョンではデフォルトのエンジンがInnoDBになっているので、有効になりますが、以前のMyISAMエンジンでは有効になりません。
で、ロックについてですが、更新中はロックが起きるのは、トランザクションを有効にしているか無効にしているかに関係なくロックされます。
MyISAMの場合はテーブル丸ごとロックし、InnoDBについてはレコード単位でロックします。
ですので、MyISAMの場合、何らかのレコードに更新処理があるときは、ほかのクライアントは更新処理が終了してから処理されます。一方、InnoDBの場合は、更新処理が行われているレコードのみがロックされているため、該当のレコード以外であれば平行して更新処理が行われます。
> 実際、WEBアプリでそこまでの例外というか処理って行うものでしょうか?
それをしなくていいのがDBですね。
> 実際はどちらの方が当たり前のほうほうなのでしょうか?
自分の場合は習慣的にSTART TRANSACTIONを使っていますが、好みの問題のような気がします。
この回答への補足
ご教授ありがとうございます。
更新系のSQLの発行では、実行中のクライアント以外は全て、処理がとまってしまうのですね。
なるほど。
レコード単位のロックというのは、たとえばあるテーブルのユニークなキー・・・とりあえずid
というカラムの id=10というレコードの処理ををAというクライアントがおこなっている場合、他のPCからBというクライアントがアクセスした場合、idが10以外のレコードであれば更新などの処理が行えるということでしょうか?
たいして、MyISAMのテーブルごとロックというのは、Aというクライアントの処理がおわるまで、クライアントB、あるいはC等、一切、手をだせないということですね?
No.3
- 回答日時:
トランザクションについてはACID特性で検索されると良いかもしれません。
ロックについてはテーブルの特性によってロックの種類を変えましょう。
クリティカルな処理は排他ロック(他のトランザクションからは参照も更新もできない)を使うことをお勧めします。
このへんはトランザクション分離レベルで検索すると出ます。
>AUTOCOMMIT = 0
僕は「AUTOCOMMIT = 0 」で運用しています。
一度に複数のテーブルを更新したり、挿入する場合途中でデッドロックしたり、タイムアウトすることがあります。このときAUTOCOMMIT = 1だと中途半端な状態でcommitされてしまいます。
あと気をつけることといえば、暗黙のコミットとというのがあります。
COMMIT流してないのにCOMMITかかったような動作があった場合に参考になると思います
No.1
- 回答日時:
MySQLのInnoDBエンジンでは行レベルロックを行います。
テーブル単位のロックではありません。同一行について排他ロックがかかるときは先行トランザクションが終了するまで、後続のトランザクションが待たされます。
「BEGIN」はMySQLでは、「START TRANSACTION」と同義です。出来ればプロジェクトなどでは統一しておいた方がいいと思います。
http://dev.mysql.com/doc/refman/4.1/ja/innodb-tr …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- フリーソフト 色々な形式の個人情報を後で参照しやすいようWindow10で管理したいのですが、どんな方法があるの? 1 2023/04/29 16:46
- JavaScript Typescript が必要な理由 1 2023/01/07 11:45
- サーバー Webサイト構築フリーランスの案件受注について 1 2022/03/27 18:16
- Illustrator(イラストレーター) イラストレーターが買えない 1 2022/08/25 13:23
- 法学 不正アクセス禁止法の扱いについて 4 2022/03/23 18:13
- ネットワーク 自分のPC(ローカル環境)から,Webページにアクセスする過程についての質問です。 1 2023/03/19 23:00
- アプリ swiftでスマホアプリを開発した時の動作確認 1 2023/02/14 11:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT時の行ロックの必要性に...
-
accessのロック
-
どういう時にテーブルロックを...
-
Oracleの排他制御について教え...
-
SELECT文でのデッドロックに対...
-
更新ロックとデッドロック
-
SQLServer Insertが遅い
-
DB2でSelectした時(rollback,c...
-
「マスタ」と「テーブル」の違...
-
2つのテーブルから条件に一致...
-
accessテーブル作成クエリを実...
-
データの二重表示の原因
-
重複するキーから一番古い年月...
-
[ BETWEEN ] vs [ >= AND <= ]
-
ACCESS2007 フォーム 「バリア...
-
ACCESSのSQLで、NULLかNULLでな...
-
accessからSQLサーバへの移行。
-
ACCESS 一番最新の日付の金額...
-
場合によって条件を変えるSQL
-
Access VBA [リモートサーバー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT時の行ロックの必要性に...
-
SELECT文でのデッドロックに対...
-
accessのロック
-
Oracleの排他制御について教え...
-
INSERTにおいてロック処理は必要か
-
SQLServer Insertが遅い
-
AccessShareLock はどの程度気...
-
SELECT文でタイムアウト...
-
DB2でSelectした時(rollback,c...
-
UPDATE文で発生するデッドロッ...
-
トランザクション中にSELECTし...
-
ExcelからAccess2013DBを更新す...
-
max+1で初番する場合 for updat...
-
更新ロックとデッドロック
-
SELECT FOR UPDATE にトランザ...
-
同時書き込み
-
DB2のロック調査
-
排他ロックしたレコードが、別...
-
DB2の更新ロックについて
-
パススルークエリでのロックに...
おすすめ情報