2016-04-02 33 views
1

için, bir sonraki numarası almak için nasıl PostgreSQL için this yapmaya çalışıyorum. PostgreSQL Yazarlarında okuyucuyu engellemeyi anlamıyorum. Öyleyse bir tablodaki sırayı nasıl güvenli bir şekilde artırabilirim. PostgreSQL'in bir dizi özelliğine sahip olduğunun farkındayım, ancak bunu aramıyorum çünkü o zaman veritabanında oluşturulan binlerce dizim olurdu.PostgreSQL

+----+-----------+------+-------+--+ 
| id | Part  | Seq | Model | | 
+----+-----------+------+-------+--+ 
| 1 | Head  | 0 | 3  | | 
| 2 | Neck  | 1 | 3  | | 
| 3 | Shoulders | 2 | 29 | | 
| 4 | Shoulders | 2 | 3  | | 
| 5 | Stomach | 5 | 3  | | 
| 6 | Groin  | 6 | 3  | | 
+----+-----------+------+-------+--+ 
: Ben Modeli Yani burada 3 için Stomach sonraki seq ile yeni bir rekor ekleyebilirsiniz nasıl

+----+-----------+------+-------+--+ 
| id | Part  | Seq | Model | | 
+----+-----------+------+-------+--+ 
| 1 | Head  | 0 | 3  | | 
| 2 | Neck  | 1 | 3  | | 
| 3 | Shoulders | 2 | 29 | | 
| 4 | Shoulders | 2 | 3  | | 
| 5 | Stomach | 5 | 3  | | 
+----+-----------+------+-------+--+ 

yeni tablo gibi görünmek için varsayalım şudur:

Böyle bir tablo var

Model 3 sadece en yüksek seq sonraki numarayı verecek bir ekleme sorgusu oluşturabilir bir yolu var mı. Ayrıca, eşzamanlılık güvenli bir şey arıyor.

+0

[tablo kilitleri] vardır (http://www.postgresql.org/docs/current/static/sql-lock.html) ve [danışma kilitleri] (http://www.postgresql.org/docs/ 9.1/static/functions-admin.html # FUNCTIONS-ADVISORY-LOCKS) gerçekten ihtiyacınız varsa –

cevap

1

Sen as anahtar kelime kullanarak ekleme açıklamada tabloyu sorgulayabilir. Tam sözdizimini here bulabilirsiniz, ancak bu durumda ihtiyacınız olan sözdizimi insert into <table_name> (<columns...>) <query>'dur. Bir SHARE ROW EXCLUSIVE (İBBS) kilidi gerekir gibi benzer bir sorgu çalıştırmak edemez emin diğer oturumları yapmak için

, bu sesler. Belgelere göre: Bu mod, bir tabloyu eşzamanlı veri değişikliklerine karşı korur ve kendinden münhasırdır, böylece bir seferde yalnızca bir oturum tutulabilir. Bir SRE kilidi, herhangi bir ek sırasında elde edilen diğer ROW EXCLUSIVE (RE) kilitleriyle çakışmaya girer, ancak yine de tablodan okumaya izin verir. Kendi başına bir RE kilidi, diğer oturumların eşzamanlı ekleme yapmasını engellemez, bu nedenle basit bir ekleme, eşzamanlı değişikliklere karşı koruma sağlamak için yeterli olmayacaktır.

bir SRE kilit normal olarak bir tablo değiştirerek veya bir tetikleyici oluşturarak otomatik olarak elde edilir, ama aynı zamanda el ile oluşturulabilir. Kilitlemeyi takmadan hemen önce elde etmek isteyeceksiniz ve ardından değişiklikinizi mümkün olan en kısa sürede gerçekleştirerek serbest bırakacaksınız. Örneğin

:

begin work; 
    lock table my_table in share row exclusive mode; 

    insert into my_table 
     (id, part, seq, model) as 
    select 
     max(id) + 1 as id, 
     'Next Body Part' as part, 
     max(seq) + 1 as seq, 
     4 as model 
    from 
     my_table; 
commit work; 

(yukarıda söz çalışırken önce ya da) bu maksimum sekansı getirilirken bir uygulama engel olmaz olduğu için dışarı bakmak üzere bir uyarı, daha sonra bu işlem ve oluşturma Bu değişkeni kullanan yeni bir insert ifadesi. (ör. $max_sequence + 1 bağlama paramızlı ? as seq). Eşzamanlı kaldığından emin olmak için, aynı insert ifadesinde veya en azından uygulamada bir SRE kilidi olduğunda sıra numarasını aldığınızdan emin olmak istersiniz.

+0

Belirli satırları kilitlemenin bir yolu var mı? Büyük bir masa var ve tüm masayı kilitlemek istemiyorum. Satırlar kilitlendiğinde okumaları engellemek ve yazmak istiyorum. – Luke101

+0

Bunun yerine, SHARE EXCLUSIVE LOCK isteyebilirsiniz. Yayını, bunun nasıl çalışacağını yansıtacak şekilde güncelledim. Hala okuyabiliyordunuz, ama sonunda bahsi geçen uyarıya dikkat ederseniz eşzamanlılık ile ilgili bir problem yaşamamalısınız. – redbmk