Aşağıdaki kodun sizde olduğunu varsayalım (lütfen bunun korkunç olduğunu dikkate almayın):
BEGIN TRAN;
DECLARE @id int
SELECT @id = id + 1 FROM TableA;
UPDATE TableA SET id = @id; --TableA must have only one row, apparently!
COMMIT TRAN;
-- @id is returned to the client or used somewhere else
Gözüme göre, bu eşzamanlılık düzgün yönetmiyor. Sırf bir işleminiz olduğu için, güncelleme bildiriminize gelmeden önce başkasının okuduğunuz değeri okumamayacağı anlamına gelmez.
Şimdi, kodu olduğu gibi bırakmak (bunun tek bir ifadeyle daha iyi ele alındığını veya otomatik bir öznitelik / kimlik sütunu kullanarak daha iyi işlendiğinin farkındayım), eşzamanlılığı düzgün bir şekilde işlemesini sağlamanın ve iki istemcinin aynı olmasına izin veren yarış koşullarını önlemenin kesin yolları nelerdir? kimlik değeri?
WITH (UPDLOCK, HOLDLOCK)
SELECT'e bir ekleme yapmanın hile yapacağına eminim . SERIALIZABLE işlem yalıtım düzeyi (Başkasının tran bitene kadar ne yaptığını okumak için inkar beri de işin görünüyor ediyorum GÜNCELLEME . Bu yanlıştır Bkz Martin'in cevabı). Bu doğru mu? Her ikisi de eşit derecede iyi çalışır mı? Biri diğerine mi tercih edilir?
Kimlik güncellemesinden daha meşru bir şey yaptığınızı hayal edin - güncellemeniz gereken bir okumaya dayalı bir hesaplama. Bazıları yazacağınız, bazıları yazmayacağınız birçok tablo olabilir. Buradaki en iyi uygulama nedir?
Bu soruyu yazdıktan sonra kilitleme ipuçlarının daha iyi olacağını düşünüyorum çünkü o zaman sadece ihtiyacınız olan masaları kilitlemektesiniz ama birinin girişini takdir ediyorum.
PS Ve hayır, en iyi cevabı bilmiyorum ve gerçekten daha iyi bir anlayış elde etmek istiyor! :)
update
kullanılmayan verilere dayanarak yayınlamasını engellemek ister misiniz ? Daha sonra,rowversion
güncellenecek satırın okunduğundan beri değişip değişmediğini kontrol etmek için sütunu kullanabilirsiniz .