(同じ利用者による、間の5版が非表示)
3行目: 3行目:
あるトランザクションが共有資源(データやファイル)にアクセスしている時は、<br>
あるトランザクションが共有資源(データやファイル)にアクセスしている時は、<br>
他トランザクションからはアクセスできないようにして直列に処理されるように制御することである。<br>
他トランザクションからはアクセスできないようにして直列に処理されるように制御することである。<br>
<br>
同時アクセスによる不整合の例<br>
同時アクセス.png
<br>
排他制御をすることで整合性を保つ<br>
排他制御.png
<br>
排他制御の方式<br>
排他制御の実現方式はいくつか存在するが、ここでは代表的な楽観ロック(楽観的排他制御)と悲観ロック(悲観的排他制御)を記載する。<br>
<br><br>
<br><br>


== 楽観ロック(楽観的排他制御) ==
== 排他制御の方式 ==
排他制御の実現方式はいくつか存在するが、ここでは代表的な楽観ロック(楽観的排他制御)と悲観ロック(悲観的排他制御)を記載する。<br>
<br>
===== 楽観ロック(楽観的排他制御) =====
楽観ロックとは、滅多なことでは他者との同時更新は起きないであろう、という楽観的な前提の排他制御のことである。<br>
楽観ロックとは、滅多なことでは他者との同時更新は起きないであろう、という楽観的な前提の排他制御のことである。<br>
データそのものに対してロックは行わずに、更新対象のデータがデータ取得時と同じ状態であることを確認してから更新することで、<br>
データそのものに対してロックは行わずに、更新対象のデータがデータ取得時と同じ状態であることを確認してから更新することで、<br>
20行目: 14行目:
<br>
<br>
楽観ロックを使用する場合は、更新対象のデータがデータ取得時と同じ状態であることを判断するために、<br>
楽観ロックを使用する場合は、更新対象のデータがデータ取得時と同じ状態であることを判断するために、<br>
Versionを管理するためのカラム(Versionカラム)を用意する。<br>
バージョンを管理するためのカラム(Versionカラム)を用意する。<br>
更新時の条件として、データ取得時のVersionとデータ更新時のVersionを同じとすることで、データの整合性を保証することができる。<br>
<br>
<br>
楽観ロック.png
更新時の条件として、データ取得時のバージョンとデータ更新時のバージョンを同じとすることで、データの整合性を保証することができる。<br>
<br>
[[ファイル:Database Lock 1.png|フレームなし|中央]]
<br>
<br>
更新対象のデータがデータ取得時と同じ状態であることを判断するためのカラムを、ロックキーと呼ぶ。<br>
更新対象のデータがデータ取得時と同じ状態であることを判断するためのカラムを、ロックキーと呼ぶ。<br>
ロックキーは、Versionカラム以外にも更新日時等のタイムスタンプを用いることもできる。<br>
ロックキーは、バージョンカラム以外にも更新日時等のタイムスタンプを用いることもできる。<br>
ただし、タイムスタンプを秒単位までしか保有していない場合、同一秒に複数の操作を行われた時に楽観ロックの判定ができなくなる。<br>
ただし、タイムスタンプを秒単位までしか保有していない場合、同一秒に複数の操作を行われた時に楽観ロックの判定ができなくなる。<br>
<br>
また、より精度の高いミリ秒まで保有していたとしても同様のことが言える。<br>
また、より精度の高いミリ秒まで保有していたとしても同様のことが言える。<br>
つまり、タイムスタンプではこの懸念は払拭できないため、ロックキーはVersionカラムを利用した方が無難である。<br>
つまり、タイムスタンプではこの懸念は払拭できないため、ロックキーはバージョンカラムを利用した方が無難である。<br>
<br>
また、検知のタイミングが業務終了時での検知となるため、画面入力に時間がかかる業務の場合は最初からやり直しになってしまい、<br>
また、検知のタイミングが業務終了時での検知となるため、画面入力に時間がかかる業務の場合は最初からやり直しになってしまい、<br>
結果として時間のロスとなってしまう。<br>
結果として時間のロスとなってしまう。<br>
<br><br>
<br><br>


== 悲観ロック(悲観的排他制御) ==
===== 悲観ロック(悲観的排他制御) =====
他者が同じデータに頻繁に変更を加えるであろう、という悲観的な前提の排他制御のことである。<br>
他者が同じデータに頻繁に変更を加えるであろう、という悲観的な前提の排他制御のことである。<br>
更新対象のデータを取得する際にロックをかけることで、他のトランザクションから更新されないようにする方式である。<br>
更新対象のデータを取得する際にロックをかけることで、他のトランザクションから更新されないようにする方式である。<br>
42行目: 39行目:
データの整合性を保証することができる。<br>
データの整合性を保証することができる。<br>
<br>
<br>
asdada.png
[[ファイル:Database Lock 2.png|フレームなし|中央]]
<br>
<br>
データのロックは、SELECT ... FOR UPDATE文を利用して実現されるのが一般的である。<br>
データのロックは、SELECT ... FOR UPDATE文を利用して実現されるのが一般的である。<br>
62行目: 59行目:


== 排他制御方式の比較 ==
== 排他制御方式の比較 ==
 
<center>
{| class="wikitable"
|-
!  !! 楽観ロック !! 悲観ロック
|-
! 思想
|| 業務開始から終了まで<br>他者による更新は滅多に起きないという前提 ||  業務開始から終了まで<br>他者による更新は頻繁に起きるという前提
|-
! 競合検知のタイミング
|| 業務終了時に検知 || 業務開始時に検知
|-
! 開発コスト
|| 比較的低い || 高い
|-
! どちらを使用するか
|| ・同一業務を複数人では実施しない場合<br>・競合があまり発生せず、発生してもやり直せば済む場合<br>・時間があまり掛からない場合
|| ・同一業務を複数人で実施する場合<br>・競合が発生したらやり直せない場合<br>・時間が掛かる場合
|}
</center>
<br><br>
<br><br>


108行目: 123行目:
どの方式も間違いではないため、業務要件を鑑みてしっかりと検討したうえで一番マッチする方式を採用する。<br>
どの方式も間違いではないため、業務要件を鑑みてしっかりと検討したうえで一番マッチする方式を採用する。<br>
<br><br>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:SQL_Server]]
[[カテゴリ:SQL_Server]]