Aracılığıyla paylaş


İyimser Eşzamanlılık

İyimser eşzamanlılık , adını işlemler arasındaki çakışmaların nadiren gerçekleşeceği iyimser varsayımından türetir; başka bir işlem, geçerli işlem tarafından okunma zamanı ile güncelleştirildiği veya silindiği zaman arasında bir veri satırını güncelleştirdiğinde veya sildiğinde bir çakışmanın oluştuğu söylenir. Uygulama geliştiricisinin bu tür çakışmaların yaygın olduğuna inandığı kötümser eşzamanlılık veya kilitlemenin tersidir.

İyimser eşzamanlılıkta, satırı güncelleştirme veya silme zamanı gelene kadar bir satırın kilidi açık bırakılır. Bu noktada, satır yeniden okunur ve son okunduktan sonra değiştirilip değiştirilmediğini görmek için denetlenir. Satır değiştiyse güncelleştirme veya silme işlemi başarısız olur ve yeniden denenmelidir.

Bir satırın değiştirilip değiştirilmediğini belirlemek için yeni sürümü satırın önbelleğe alınmış bir sürümüne karşı denetlenir. Bu kontrol, örneğin SQL Server'daki timestamp sütunu veya satırdaki her sütunun değerleri gibi satır sürümüne dayanabilir. Birçok DBMS, satır sürümlerini desteklemez.

İyimser eşzamanlılık, veri kaynağı veya uygulama tarafından uygulanabilir. Her iki durumda da, uygulama Read Committed gibi düşük bir işlem yalıtım düzeyi kullanmalıdır; daha yüksek bir düzey kullanmak, iyimser eşzamanlılık kullanılarak kazanılan artan eşzamanlılığı olumsuzlar.

İyimser eşzamanlılık veri kaynağı tarafından uygulanırsa, uygulama SQL_ATTR_CONCURRENCY deyimi özniteliğini SQL_CONCUR_ROWVER veya SQL_CONCUR_VALUES olarak ayarlar. Satırı güncellemek veya silmek için, konumlandırılmış bir güncelleme veya silme işlemi gerçekleştirir ya da kötümser eşzamanlılıkta olduğu şekilde SQLSetPos'ı çağırır; güncelleme veya silme bir çakışma nedeniyle başarısız olursa sürücü veya veri kaynağı SQLSTATE 01001 (İmleç işlemi çakışması) döndürür.

Uygulamanın kendisi iyimser eşzamanlılık uygularsa, SQL_ATTR_CONCURRENCY deyimi özniteliğini bir satırı okumak için SQL_CONCUR_READ_ONLY olarak ayarlar. Satır sürümlerini karşılaştıracaksa ve satır sürümü sütununu bilmiyorsa, bu sütunun adını belirlemek için SQL_ROWVER seçeneğiyle SQLSpecialColumns'ı çağırır.

Uygulama, eşzamanlılığı SQL_CONCUR_LOCK (satıra yazma erişimi elde etmek için) artırarak ve uygulama okurken satırın sahip olduğu sürümü veya değerleri belirten bir WHERE yan tümcesiyle UPDATE veya DELETE deyimi yürüterek satırı güncelleştirir veya siler. Satır o zamandan beri değiştiyse, ifade başarısız olur. WHERE yan tümcesi satırı benzersiz olarak tanımlamıyorsa, deyimi diğer satırları da güncelleştirebilir veya silebilir; satır sürümleri her zaman satırları benzersiz olarak tanımlar, ancak satır değerleri yalnızca birincil anahtarı içerdiklerinde satırları benzersiz olarak tanımlar.