no memo

メモばっか

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

  • ODBC Open Database Connectivity. csv fileへのアクセスを簡単にしたり。

  • ACID特性

 特性名 説明 機能
Atomicity 原子性:1(実行完了)か0(未完了)か コミットメント制御
Consistency 一貫性:トランザクションの状態に関わらずDBの整合性が保たれなければならない 排他制御(ロック)
Isolation 独立性:複数トランザクションを同時実行しても、単発で複数個実行しても同じ結果にならなければいけない 排他制御
Durability 耐久性:障害発生時もトランザクション内容を保持しなければならない

排他制御1:ロック * ロック > 占有ロックと共有ロック * デッドロック * 検出 * 待ち状態のまま一定時間が経過したらデッドロックとみなす * 各トランザクションが占有している資源の有向グラフ=待ちグラフを作る * 解除  * ロールバック

排他制御2:ロック以外 * 時刻印方式:timestampを記録 * 楽観的方式:書き込み直前に更新されていないかチェック。更新されていたら計算し直してから書き込む。 indexeddb のcursorもう一度読みに行こう。。。