Bağlantının kaybedilmesi / kesilmesi durumunda Postgres'in uzun süredir devam eden sorgusu iptal ediliyor mu?


20

Postgres'e bir bağlantı açar ve uzun süren bir sorgu gönderir ve sonra bağlantıyı koparırsam (örneğin, bağlantıyı açan istemci işlemini öldürürsem), uzun süren sorgu çalışmaya devam eder mi yoksa otomatik olarak iptal edilir mi? Bu yapılandırılabilir mi?

(Postgresql 9.2.9 kullanıyorum)

Yanıtlar:


32

"Değişir".

İstemci ağ bağlantısı kaybından dolayı kaybolursa, sorgu genellikle ağ gönderme arabelleğini dolduracak kadar satır alınana kadar çalışır, ardından durur ve TCP bağlantısı kesilene kadar takılı kalır. O tamamlanırsa önce başarıyla tamamlarsınız tampon, TCP gönderme doldurur böylece 's autocommit eğer sorgu taahhüt edecektir.

İstemci, istemcinin işletim sisteminin sunucuya bir TCP RST (istemci segfault / crash, SIGTERM, SIGKILL, vb.) Yoluyla rapor verebileceği şekilde öldürülürse, PostgreSQL sunucusu kesme bayrağını ayarlayacaktır. Bir dahaki sefere sorgu yürütülürken kesinti olup olmadığını kontrol ederse, bayrağı görür ve iptal eder. Bazen bir sorgu, bazı uzantıları ve PostgreSQL çekirdeği içindeki birkaç yeri - kodları kesintileri kontrol etmeyen CPU içinde ağır işler yapıyor olabilir, bu durumda kesmeyi uzun süre fark etmeyebilir ve çalışmaya devam edebilir. Yine de, otomatik taahhüt varsa tamamlamadan ve taahhütte bulunmadan önce her zaman kesmeyi ve iptal etmeyi görür.

İstemci ani bir OS yeniden başlatılması gibi bir şey tarafından öldürülürse, istemci ana bilgisayar aniden TCP bağlantısı hakkında hiçbir şey bilmez, ancak yine de ağda yanıt verebilirse, sorgu bir satır yazmayı ilk kez test etmeyi denediğinde muhtemelen iptal edilir. Jeff, istemcinin ana bilgisayarı, yeniden başlatma sonrasında sunucu tarafından gönderilen ilk pakete yanıt olarak bir TCP RST göndereceğinden dedi. PostgreSQL, gönderdiği her satırdaki kesintileri kontrol eder.

Bu davranış yapılandırılamaz. PostgreSQL söz konusu olduğunda, eğer müşteri ortadan kalkarsa işi müşterinin çalıştırdığı sorguları sonlandırmaktır. Sorgu başlangıcında alabileceğiniz bir tür sorgu tamamlama belirtecine ihtiyacınız olacağını değiştirmek için, daha sonra sunucuyu başka bir bağlantı üzerinden sorgu hakkında sormak için kullanın. Temel olarak, eşzamansız / arka plan sorguları uygulamanız gerekir. Muhtemelen güzel bir özellik, ancak şu anda desteklenmiyor.

Sorgu otomatik tamamlanıyorsa veya sorgunuz COMMITistemciyi öldürdüğünüzde / bağlantıyı kaybettiğiniz sırada uçuştaysa, bir işlemin istemcinin veya taahhüt etmedi. İşlemin veriler üzerindeki etkilerini aramaktan başka gerçek bir yol yoktur.

Bu kabul edilemez olduğunda, iki aşamalı kesinleştirme ve bir müşteri tarafı işlem yöneticisi kullanabilirsiniz.


1
Vay canına, aradığım tek şey, mükemmel ve ayrıntılı bir cevap! Teşekkürler @Craig_Ringer!
Rob Bednark

1
@CraigRinger ile ilgili bir soru soruldu: pgAdmin III
ypercubeᵀᴹ

2

Satırları bağlantıya döndürmeye çalışana ve kopmayı algılayana kadar çalışmaya devam eder. Bu nedenle, herhangi bir satırı döndürmeden önce tüm işi yapan bir sorgu için temelde tamamlanacaktır.


Teşekkürler @jjanes. Bunu gösteren herhangi bir belgeye veya kaynak koduna işaret edebilir misiniz?
Rob Bednark
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.