2013-06-08 8 views
6

W moim kodzie Railsowym muszę potwierdzić, że akcja jest dozwolona tylko wtedy, gdy jest więcej niż 1 z określonego rekordu. Z tego powodu muszę zablokować aktualizacje, a następnie wykonać odczyt. Mój kod szyn wygląda następująco:Szyny + MySQL + Transakcje + Blokowanie, w jaki sposób zapobiec odblokowaniu transakcji przez odblokowanie tabeli?

PaymentProfile.transaction do 
    profiles = PaymentProfile.lock("LOCK IN SHARE MODE").where(user_id: xxx) 

    if profiles.count > 1 
    #allow 
    else 
    #do not allow 
    end 
end 

Teoretycznie działa to dobrze i prawidłowo blokuje rzędy. JEDNAKŻE, jeśli kolejne żądanie przechodzi przez tę samą ścieżkę kodową, otwarcie transakcji usuwa blokadę, którą wyjąłem w innym procesie, tym samym pokonując cel blokady.

Od docs MySQL:

Beginning a transaction also causes table locks acquired with LOCK TABLES to be released, as though you had executed UNLOCK TABLES. Beginning a transaction does not release a global read lock acquired with FLUSH TABLES WITH READ LOCK. 

Odpowiedz

2

będę zakładać, że inny wniosek będzie traktowany przez inny proces, albo przynajmniej z innym Podłączenie (MySQL) (przepraszam, że nie wiedzą nic o Ruby- na szynach).

Blokada przejęta przez daną transakcję nie może zostać zwolniona przez inną transakcję. To jest właśnie cel blokady. Jak the manual stawia go:

UNLOCK TABLICE wyraźnie zwalnia żadnych blokad tabeli posiadaniu aktualnej sesji

Jeśli moje założenie jest poprawne, nie ma się czym martwić. W przeciwnym razie, jeśli dwa żądania mogą używać tego samego połączenia w tym samym czasie, jest coś naprawdę podejrzanego w tej architekturze ...

0

Może, w takim przypadku powinieneś użyć semafora mutex (http://www.ruby-doc.org/core-2.0/Mutex.html), aby uniknąć równoczesnego dostępu do ten zasób współużytkowany (w tym przypadku to twój procesor PaymentProfile). W ten sposób zagwarantujesz, że dwa współbieżne procesy nie będą miały dostępu do zsynchronizowanego bloku kodu w tym samym czasie.

Mam nadzieję, że pomoże

Powiązane problemy