cursorとDBの基本のめも
DBのカーソル(Cursor)基礎まとめ。
Cursor とは
DBに対して(主にループ処理や分岐を含んだ連続処理)を行いたい時にsetする。
SQL (syntax)
- 宣言
- open
- while 文書き出し
- BEGIN ループ処理 END
- close
DECLARE CURSOR_NAME CURSOR FOR (SELECT ... FROM ... *FOR UPDATE OF TABLE_NAME) OPEN CURSOR_NAME WHILE :FETCH_STATUS = 0 ## FETCH_STATUS success: 0, failed: 1, empty: 2 BEGIN UPDATE tablename set hoge = fuga ## ... roop処理の対象 WHERE CURRENT OF CURSOR_NAME ## current cursor に↑(のroop処理)を実行 FETCH NEXT FROM CURSOR_NAME INTO hoge ##hoge:roop処理で使う処理 ## 1行目の時:1行目をfetch、その他:次の行をfetch END CLOSE CURSOR_NAME
宣言の時に * のFOR UPDATE OF をつけると捜査中のこのテーブルをロックでき、 他のトランザクションと同時に実行されて整合性が失われることを防げる。
参考
もっと基本がわからなくなった時 【MySQL, SQL】データベースを扱う基本SQL一覧
公式 MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.6.6 カーソル
その他めも
きほんのき Create:
INSERT
Read:SELECT
Update:UPDATE
Delete:DELETE
ACID特性
特性名 | 説明 | 機能 |
---|---|---|
Atomicity | 原子性:1(実行完了)か0(未完了)か | コミットメント制御 |
Consistency | 一貫性:トランザクションの状態に関わらずDBの整合性が保たれなければならない | 排他制御(ロック) |
Isolation | 独立性:複数トランザクションを同時実行しても、単発で複数個実行しても同じ結果にならなければいけない | 排他制御 |
Durability | 耐久性:障害発生時もトランザクション内容を保持しなければならない |
排他制御1:ロック * ロック > 占有ロックと共有ロック * デッドロック * 検出 * 待ち状態のまま一定時間が経過したらデッドロックとみなす * 各トランザクションが占有している資源の有向グラフ=待ちグラフを作る * 解除 * ロールバック
排他制御2:ロック以外 * 時刻印方式:timestampを記録 * 楽観的方式:書き込み直前に更新されていないかチェック。更新されていたら計算し直してから書き込む。 indexeddb のcursorもう一度読みに行こう。。。