PostgreSQL'deki işlemler p imleç başına veya bağlantı başına `` psycopg2 '' mi?


10

Ben psycopg2veritabanı API kullanarak PostgreSQL 9.3 ile bazı işler yapıyorum .

Minimum izolasyon düzeyinde ("otomatik taahhüt" modu) ayarlanmış DB API var ve kendi SQL ile doğrudan kendi işlemleri yönetiyorum. Misal:

cur = self.conn.cursor()
cur.execute("BEGIN;")
cur.execute("SELECT dbId, downloadPath, fileName, tags FROM {tableName} WHERE dlState=%s".format(tableName=self.tableName), (2, ))
ret = cur.fetchall()
cur.execute("COMMIT;")

Temel olarak, cur.execute("BEGIN;")sınırlı bir şekilde başlatılan işlem sadece imleçle mi, yoksa tüm bağlantı için self.conn.cursor()mi ( )?

Yaptığım bazı daha karmaşık şeyler, mantıksal olarak işlevlere ayrılan birden fazla ayrı veritabanı işlemi içeriyor. Bunların hepsi üye olarak bağlantıya sahip bir sınıfta olduğundan, her işlev içinde imleçler oluşturmak çok daha uygundur. Ancak, bir işlem içinde imleç oluşturmanın nasıl çalıştığından emin değilim .

Temel olarak, işlemler bağlantı başına ise, işlem içinde anında çok sayıda imleç oluşturabilirim. Eğer imleç başına iseler, imleci her yere iletmem gerektiği anlamına gelir. Hangisi?

Belgeleme buna değinmese de, arayabileceğiniz gerçeği , işlem kontrolünün bağlantı başına olduğundan oldukça emin connection.commit()olmamı sağlıyor .

Yanıtlar:


7

İşlemler oturum başına, yani bağlantı başına yapılır.

PostgreSQL, işlemlerin askıya alınmasını ve sürdürülmesini desteklemez, bu nedenle psycopg2, sahnelerin arkasında örtülü olarak yeni bağlantılar oluşturmadığı sürece imleç başına yapamaz.

Uygulamada psycopg2'nin imleçlerini özellikle kullanışlı bulmuyorum. Sunucudan artımlı getirme kullanmıyorsanız sonuç kümelerini koruyabilirler, ancak bunları başka bir şey için iyi bulmuyorum.

Neden elle vermek beginve commitolmasına rağmen daha çok onlar için bağlantı yöntemlerini kullanarak daha?


Belgelerden AFICT olarak, "DB API" modelinin tamamı açık işlemleri desteklemiyor.
Sahte Ad

1
@FakeName Açıkça yapmanız gerekmez begin. Hiçbir işlem açık değilse, sizin için yeni bir işlem başlatılır. Sadece commitişlemleri tarif etmek için. Yani evet, DB-API modeli yapar desteği açık hareketleri.
Craig Ringer

1
DB api bunu özellikle yönlendirmem olmadan otomatik olarak yapıyorsa, bu çok örtük bir başlangıçtır . Ve ayrıca, ilgisiz, çünkü (soruda belirtildiği gibi), otomatik taahhüt modunu kullanıyorum, çünkü bu otomatik ifadeleri istemiyorumBEGIN . psycopg2Her biri için yeni bir işlem oluşturmak istemiyorum SELECT.
Sahte İsim

TL; DR temelde devam eden tüm işlemlerin tam kapsamını bilmek istiyorum çünkü A. bu şekilde deliyim ve B. hata ayıklamada çok yardımcı oluyor.
Sahte İsim

1
Ben bu ile haşhaş garip böcek görmek için sürpriz olmaz. AFAIK otomatik komitesi, manuel işlem yönetimi değil otomatik komuta yöneliktir . İşlem kapsamlarını gerçekten manuel olarak yönetmek istiyorsanız, ekstra BEGINbir zararsızdır ve PostgreSQL tarafından göz ardı edilecektir WARNING: there is already a transaction in progress.
Craig Ringer

1

Gönderen psycopg2 belgelerinde:

Psycopg'da işlemler bağlantı sınıfı tarafından yapılır. Varsayılan olarak, veritabanına ilk kez bir komut gönderildiğinde (bağlantı tarafından oluşturulan imleçlerden birini kullanarak), yeni bir işlem oluşturulur. Aşağıdaki veritabanı komutları aynı işlem bağlamında yürütülür - yalnızca ilk imleç tarafından verilen komutlar değil, aynı bağlantı tarafından oluşturulan tüm imleçler tarafından verilen komutlar. Herhangi bir komut başarısız olursa, işlem iptal edilir ve rollback () yöntemine çağrı yapılıncaya kadar başka bir komut yürütülmez.

Aynı zamanda, 2.4.2 sürümünden, autocommitözellik vardır (vurgu eklenmiştir):

Okuma / yazma özniteliği: Truesürücü tarafından hiçbir işlem yapılmazsa ve arka uca gönderilen her ifadenin hemen etkisi olur; eğer False yeni bir işlem ilk komut yürütme başlatılır yöntemleri: commit()ya rollback()elle işlem sonlandırmak için çağrılması gerekir.

Otomatik bitiş modu, CREATE DATABASEveya gibi bir işlemin dışında çalıştırılması gereken komutları yürütmek için kullanışlıdır VACUUM.

FalseDBAPI belirtimine göre varsayılan değer (manuel kesinleştirme) şeklindedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.