📘

5/22~5/26で技術的にやったこと

2023/05/28に公開

悲観ロックと楽観ロックについて

参考文献

排他制御とは?

共有資源に対して複数のアクセスが見込まれる場合に同時アクセスにより不整合が発生することを防ぐためあるトランザクションが共有資源にアクセスしているときは他トランザクションからはアクセスできないようにして直列に処理されるように制御すること

悲観ロック(悲観的排他制御)

他者が同じデータに頻繁に変更が加えられると悲観的な排他制御。更新対象のデータ取得する際にロックをかけることで他のトランザクションから更新しないようにする方式。悲観ロックを使用する場合はトランザクション開始直後に更新対象となるレコードをロックを取得する。ロックされたレコードはトランザクションがコミットまたはロールバックされるまで他のトランザクションから更新されないためデータの整合性を担保することができる。

※例えば、管理者でロック解放できるとかセッション切れたらロック解放するとかそこらへんの仕組みは整備しておく必要がある

楽観ロック(楽観的排他制御)

滅多なことでは他者との同時更新は起きないであろうという楽観的な前提の排他制御。データそのものに対してロックは行わず、更新対象のデータがデータ取得時と同じ状態であることを確認してから更新することでデータの生合成を保証する方式。更新対象のデータがデータ取得時と同じ状態であることを判断するために、versionカラムを用いて判断する。これをロックキーと呼ぶ。ロックキーはタイムスタンプでも用いられる。

__aexit__と__aenter__ってなに?

__aexit__と__aenter__は、Pythonのコンテキストマネージャ(Context Manager)プロトコルにおける特殊メソッドです。
コンテキストマネージャは、リソースの確保や解放などの処理を自動化するために使用されます。一般的な使い方は、withステートメントを使用してコンテキストを作成し、その中でリソースを利用するコードを実行します。コンテキストを抜ける際には、自動的にリソースの解放などのクリーンアップ処理が行われます。
__aexit__と__aenter__は、非同期コンテキストマネージャ(Asynchronous Context Manager)のバージョンです。非同期コンテキストマネージャは、非同期処理(Async/Await)に対応したコンテキスト管理を行うために使用されます。
aenter(self) -> Awaitable[None]:
非同期コンテキストに入ったときに呼び出されるメソッドです。
await可能なオブジェクトを返す必要があります。
通常、リソースの確保や初期化などの処理を行います。
aexit(self, exc_type, exc_val, exc_tb) -> Awaitable[Optional[bool]]:
非同期コンテキストから出る際に呼び出されるメソッドです。
exc_type, exc_val, exc_tbは例外情報を表す引数です。
await可能なオブジェクトを返すことができますが、通常はクリーンアップ処理や例外のハンドリングを行います。
返り値がTrueの場合は例外を抑制し、Falseの場合は例外を再度発生させます。Noneを返すと例外を抑制せず、通常の挙動になります。
これらのメソッドを使用することで、リソースの適切な確保と解放、例外処理をコンテキスト内で行うことができます。

cacheの解放とかそこらへんに使えると思う。

Discussion