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
Tamam, sql-server kaldırıldı .... – user3489820