sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLでデッドロックをシミュレートする方法は?

    1. psqlの2つのインスタンスのように、2つの接続を並行して開きます またはpgAdminの2つのクエリウィンドウ(それぞれに独自のセッションがあります)。
    2. 各接続でトランザクションを開始します。 BEGIN;
    3. 相互に競合するコマンドを順番に実行します。
    4. コミットする前に、2つのうちの1つがデッドロック例外でロールバックされます。
    5. もう一方をロールバックすることをお勧めします。 ROLLBACK;

    明示的にテーブルをロックする と同じくらい簡単です:

    LOCK tbl;
    

    行のロックは次の方法で実行できます:

    SELECT * FROM tbl WHERE boo = 3 FOR UPDATE;
    

    またはFOR SHARE など。詳細はマニュアルに記載されています。
    (またはUPDATEを使用して暗黙的に またはDELETE 。)

    追加した例はデッドロックできません。どちらも、最初に同じテーブルの同じ行で同じロックを取得しようとします。 2番目は最初が終了するのを待ちます。

    実際にデッドロックを生成する例(行が存在する必要があります。存在しない場合、ロックは取得されません):

    Transaction 1                    Transaction 2
    BEGIN;
                                     BEGIN;
    SELECT salary1 
    FROM   deadlock_demonstration
    WHERE  worker_id = 1
    FOR    UPDATE;
                                     SELECT salary1 
                                     FROM   deadlock_demonstration
                                     WHERE  worker_id = 2
                                     FOR    UPDATE;
    UPDATE deadlock_demonstration
    SET    salary1 = 100
    WHERE  worker_id = 2;
    
                                     UPDATE deadlock_demonstration
                                     SET    salary1 = 100
                                     WHERE  worker_id = 1;
    
                        --> ... 💣 deadlock!
    

    結果

    OP user3388473は、ソリューションを確認した後、このスクリーンショットを提供しました:



    1. 2つの同期レプリカ間でSQLServerのAlwaysON可用性グループを構成します。パート2

    2. MySqlテーブルから選択オプションを設定するためのjqueryajax呼び出し

    3. MySQL BIGINT(20)とVarchar(31)のパフォーマンス

    4. グループ化された値のMysql再帰的減算および乗算