2016-11-08 3 views
-1

私は私のプロジェクトのためのPG、PG-ネイティブを使用しています、私はコードの下のようなトランザクションのものを使用し、私は https://github.com/brianc/node-postgres/wiki/Transactions
1.
このロック・テーブルの場合、または唯一のロック、データベースに精通していませんよ行?
2.ロックは、CreateUpdateDeleteCRUDにダイバーブルを意味します。しかし、まだReadすることができますか?そうであれば、データを選択するか、この変更前のデータ(BEGINの前)ですか?PostgreSQLのトランザクションロック

"PG":全体像について "^ 1.10.0"、

var pg = require('pg').native; 
... 

var rollback = function(dbClient, response) { 
    dbClient.query('ROLLBACK', function() { 
    dbClient.end(); 
    // reject(response); 
    }); 
}; 

dbClient.query('BEGIN', function(error, result) { 
    ... 

dbClient.query('COMMIT', dbClient.end.bind(dbClient)); 
    ... 
+0

おそらく、 'BEGIN'がどのように公式のドキュメント(https://www.postgresql.org/docs/9.5/static/sql-begin.html)、https://www.postgresqlで動作するのかをお読みください。 org/docs/9.5/static/sql-set-transaction.html –

+0

@ vitaly-t返事ありがとう、以前はそこにいましたが、回答が見つかりません。 – user1775888

答えて

3

読むthe documentation: "^ 4.5.1"、 "PG-ネイティブ"。努力する価値はある。

PostgreSQLには、テーブルロックと行ロックという異なるレベルのロック機能があります(私はアドバイザリロックスには入っていません)。

テーブルロックは、LOCKコマンドで明示的に指定できますが、これはあなたが正常にしないものです。通常のケースでは、テーブル–にアクセスするときに暗黙のテーブルロックが使用されます。たとえば、テーブルのデータを読み書きすると、同時ユーザーがALTERまたはDROPになるのを防ぐロックが行われます。

行ロックは、DML文(INSERT,UPDATEおよびDELETE)とSELECT ... FOR SHARE/UPDATEによって取得されます。ロックされた行の同時変更を防止します。

すべてのロックは、トランザクションの終了時に解放されます。トランザクションを明示的に開始しなかった場合、各ステートメントは独自のトランザクションで実行され、ロックは単一ステートメントの存続期間より長くなりません。 BEGINまたはSTART TRANSACTIONでトランザクションを明示的に開始すると、COMMITまたはROLLBACKまでトランザクションが継続します。

PostgreSQL(およびマルチバージョン並行性制御を使用するその他のデータベース)の重要な設計概念の1つは、読者がライターをブロックしないことと、その逆であることです。これは、古いバージョンのデータを保存することによって容易になり、読者はスナップショット(概して、文またはトランザクションの開始時に有効なデータベースの一貫したビュー)で有効なデータを提供されます。 これらの古い行は、最終的に自動バックボーンバックグラウンドプロセスによってクリーンアップされます。

+0

あなたの説明に感謝します。 – user1775888