birden çok kullanıcı tarafından düzenleme veritabanı kayıtları

oy
23

Ben (MS SQL sunucusu üzerinde, normalize) veritabanı tabloları tasarlanmış ve bağımsız bir pencere ön ekleyip bilgileri düzenlemek için kullanıcıların bir avuç kullanılacak bir uygulama için sona oluşturduk. Biz daha sonraki bir tarihte üretim alanı genelinde arama izin vermek için bir web arayüzü katacak.

İki kullanıcılar güncellemeyi işlemeye ardından son aynı kaydı düzenlemeye başlarsanız 'kazanan' ve önemli bilgiler kaybolabilir olacağını endişeliyim. çözümlerin bir dizi akla gelen ama daha büyük bir baş ağrısı yaratmak için gidiyorum emin değilim.

  1. Hiçbir şey yapma ve iki kullanıcının hiçbir zaman aynı anda aynı kaydı düzenlemeye olacak umuyoruz. - happed ama ne yaptığını eğer hiç olabilir mi?
  2. Düzenleme rutin orijinal verilerin yanı sıra güncellemeleri bir kopyasını saklamak ve daha sonra kullanıcı düzenlemenin sona erdiğinde karşılaştırabilirsiniz. Onlar gösteri kullanıcıyı farklılık gösterir ve güncelleştirme onaylıyorsanız - veri için iki kopya saklanmasına gerek ederim.
  3. Son güncelleme DATETIME sütun ekleyin ve sonra farklılık göstermez, biz güncellediğimde eşleştiği kontrol edin. - İlgili tabloların her birinde yeni bir sütun gerektirir.
  4. Kullanıcılar kontrol edilecek rekor düzenlemeye başlayın ve aynı kaydı düzenlemeye diğer kullanıcıların önlemek zaman kaydeden bir düzenleme tablo oluşturun. - Bir kullanıcı programının dışına çökerse kilitli olma kilitlenmeleri ve kayıtları önlemek için program akışını carful düşünce gerektirecektir.

Daha iyi çözümler var mı yoksa bunlardan biri için gitmeli?

Oluştur 03/08/2008 saat 22:23
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
12

Eğer nadir çarpışmalara bekliyorsanız, İyimser eşzamanlılık muhtemelen en iyi bahistir.

: Scott Mitchell bu desen uygulamak konusunda kapsamlı bir rehber yazmıştı
uygulanması iyimser eşzamanlılık

Cevap 03/08/2008 saat 22:31
kaynak kullanıcı

oy
2

aşağıdaki gibi klasik bir yaklaşımdır:

  • Her masaya "kilitli" bir boolean alanını ekleyin.
  • Varsayılan olarak false bu ayarlayın.
  • Bir kullanıcı düzenleme başladığında, bunu yapmak:

    • (Eğer satır kilitleyemezsiniz eğer veya tüm tablo) satır kilitlemek
    • Düzenlemek istediğiniz satırın üzerine bayrağı kontrol
    • bayrak daha sonra doğruysa
      • Onlar şu anda bu satırı düzenleyemezsiniz kullanıcıyı bilgilendirmek
    • Başka
      • true bayrağı set
    • kilidi açmak

    • rekor kaydederken, false geri bayrağı set

Cevap 01/10/2008 saat 09:53
kaynak kullanıcı

oy
1

(Güncelleme süresi)> (zamanı seçin) eğer herhangi bir kullanıcı seçeneğini zaman kazandıracak kayıt seçin seçme zamanında ve güncelleme saati alan arasında karşılaştırma-ne zaman -Birinci seçme sonra başka bir kullanıcı güncelleştirme bu kaydı demek son güncelleme kaydını saklamak için açılan (güncelleme süresi) oluşturmak kayıt

Cevap 14/07/2016 saat 11:23
kaynak kullanıcı

oy
1

UPDATE SEÇ ve benzerleri bir zaman mikroskobik miktar için kiliti sağlayan iyi, ama bir makroskopik miktar için (örneğin kullanıcı verileri yüklendi ve 'kaydet' Eğer yukarıdaki gibi iyimser eşzamanlılık kullanmalıdır basılı henüz bulunmuyor. (Hangisi o, 'son yazan kazanır' genellikle sadece diğer alternatif olarak kabul olan daha kötümser olduğunu) - hep misnamed düşünüyorum.

Cevap 01/10/2008 saat 06:39
kaynak kullanıcı

oy
1

Başka bir seçenek başladığında da oldukları gibi sen değişiyor kaydındaki değerler hala aynı olduğunu test etmektir:

SELECT 
    customer_nm,
    customer_nm AS customer_nm_orig
FROM demo_customer
WHERE customer_id = @p_customer_id

(Customer_nm alanı görüntülemek ve kullanıcı değişikliği)

UPDATE demo_customer
SET customer_nm = @p_customer_name_new
WHERE customer_id = @p_customer_id
AND customer_name = @p_customer_nm_old

IF @@ROWCOUNT = 0
    RAISERROR( 'Update failed: Data changed' );

Sen masaya yeni bir sütun eklemek (ve bunu güncel tutmak) gerekmez, ancak daha ayrıntılı SQL ifadelerini oluşturmak ve geçmek zorunda mı yeni ve eski saklı yordam alanları.

Ayrıca kayıtları kilitleme yapılmasının avantajı - Hepimizin onlar olmaması gerektiği halde kayıt kilitli kalma sona erecek biliyorum çünkü ...

Cevap 13/08/2008 saat 23:32
kaynak kullanıcı

oy
1

@ Mark Harrison: SQL Server, bu sözdizimi desteklemiyor ( SELECT ... FOR UPDATE).

SQL Server eşdeğerdir SELECTdeyimi ipucu UPDLOCK.

Bkz SQL Server Books Online'da fazla bilgi için.

Cevap 04/08/2008 saat 22:54
kaynak kullanıcı

oy
0

Benimle, en iyi yolu i sütun LASTUPDATE (timetamp veri türü) vardır. seçme ve güncelleme sadece bu değeri karşılaştırmak bu çözümün başka avans veri değişimi vardır zamanı izini bu sütunu kullanabilirsiniz olmasıdır. Ben sadece çek güncelleme için isLock gibi bir colum oluşturursanız iyi olmadığını düşünüyorum.

Cevap 24/06/2011 saat 08:14
kaynak kullanıcı

oy
0

Veritabanı sizin için yapacaktır. "... seçeneğini güncelleme için" sadece bu tür şeyleri için tasarlanmıştır, bak. Size daha sonra işlemek ya da geri alabilir seçilen satırlar, üzerinde bir yazma kilidi verecektir.

Cevap 04/08/2008 saat 03:30
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more