2016-03-19 10 views
1

Lütfen aşağıdaki soruna bazı önerilerde bulunun: Benzersiz kodlar listem var. Kod sadece bir kez kullanılmalıdır, bu yüzden her kodla ilişkili bir durum vardır (kullanılmış/kullanılmamış).SQL - kilitlemek veya kilitlenmemek için: sonraki kullanılmayan kodun seçilmesi

Birden çok iş parçacığı kullanılmayan bir kod almaya çalışırsa çekişme/yarış koşulları konusunda endişeleniyorum.

SQL veritabanını (benim durumumdaki MySQL) kullanarak uygulamaya koymanın en iyi yolu nedir?

İlk seçenek kilitleme kullanmak ve salt taahhüt yalıtım düzeyi şudur: parçacığı çekişme halinde

start transaction in read-committed isolation level 
select code from code_table where status = 'not-used' for update 
update code_table set status = 'used' where code = :code 
commit transaction 

, ben, "veritabanı ipler" kilitli satırda rastlamak olacağına inanıyoruz satır yazma kilidi serbest bırakılmazsa, bu kod kaydının halihazırda kullanıldığını ve diğer kod kayıtlarına geçtiğini (okumaya bağlı yalıtım düzeyi nedeniyle) görecektir.

start transaction in default isolation level (read-repeatable) 
select code from code_table where status = 'not-used' 
commit transaction 

start transaction in default isolation level (read-repeatable) 
update code_table set status = 'used' where code = :code 
commit transaction 

Java kodunda Ne kadar kontrol eder:

İkinci seçenek (biz hazırda kullanmayın) iyimser kilitleme hazırda bekletme benzer bir şey kullanmaktır, burada adımların açıklaması kayıtları güncellendi. Güncellenmiş bir kayıt varsa her şey yolundaysa, 0 kayıt güncellendiyse - adımı tekrar ediyorum .. 3. (veya 5.) denemeyi tekrarlayın - bir istisna atın.

Her türlü yardım/öneri çok takdir edilecektir. Teşekkür ederiz Önceden

+0

Tamam, sql-server kaldırıldı .... – user3489820

cevap

2

İkinci seçenek - iyimser kilitleme - oldukça kötü bir fikir gibi görünüyor. Ara kaynaktan
: https://en.wikipedia.org/wiki/Optimistic_concurrency_control

iyimser eşzamanlılık kontrolü (OCC). . . . . . .
. . . . . . . . genellikle düşük veri çekişme ortamına sahip ortamlarında kullanılır. Çakışmalar nadir olduğunda, işlemleri, kilitleri yönetme masrafı olmadan ve işlemlerinin diğer işlemlerin kilitlerini temizle beklemeden tamamlayabilir ve diğer eşzamanlılık denetimi yöntemlerinden daha yüksek verime yol açar. Ancak, , veri kaynakları için çekişme sık ise, işlemlerinin tekrar tekrar başlatılmasının maliyeti, performansını önemli ölçüde; Diğer eşzamanlılık kontrolünün yöntemlerinin bu koşullar altında daha iyi performans gösterdiği düşünülmektedir. Ancak kilitleme temelli ("kötümser") yöntemler kilitleme tabanlı ("kötümser") yöntemler de sağlayabilir, çünkü kilitlenme önlense bile kilitleme etkili eşzamanlı olarak sınırlayabilir.

kolayca X eşzamanlı konuları ile aşağıdaki senaryoyu tahmin edebilirsiniz:

  • iplik 1. Bir sonraki kullanılmayan rekor alır 1. iplik 2. Bir sonraki kullanılmayan kayıt almaktadır
  • # 1
  • iplik # 3 bir sonraki, kullanılmamış kayıt # 1
  • iplik # 4 gr alır 1.
    .....
    .....
  • iplik 1. rekor 1. güncelleyen sonraki kullanılmayan kayıt ETS, ardından bir sonraki kullanılabilir rekor # 2
  • iplik # sürer 2 bir çarpışma rekor 1. güncellemeye çalışırken, bu nedenle yeniden deneme algılar ve sonraki uygun rekoru alır 2. iplik 3. bir çarpışma tespit
  • rekor 1. yüzden yeniden deneme güncellemeye çalışıyorum ve alırken sonraki kullanılabilir kayıt 2. kayıt # 1, bu yüzden yeniden deneme güncellemeye çalışıyorum ve bir sonraki alırken iplik 4. bir çarpışma algılar
  • mevcut rekor 2. .....
    .....
    .....
    ve benzeri vb. Çatışmalar ve tekrarlar.

İlk seçeneğe destek olmalıyız.
Çekişmeyi azaltmak için, işlemleri olabildiğince kısa tutmak isteyebilirsiniz.

+0

Teşekkür ederim! İlk seçeneği uyguladık, ancak birisinin onaylaması güzel. – user3489820

İlgili konular