2016-06-30 11 views
0

Um ein besseres Verständnis der Pessimist Verriegelung (mit InnoDB) zu bekommen, habe ich versucht, diesen Code in meine Rails-Anwendung auszuführen:Testing pessimistische Sperre mit Rails

Thread.new do 
    Account.transaction do 
    account = Account.lock(true).first 
    account.balance += 250 
    account.save! 
    end 
end 

Thread.new do 
    Account.transaction do 
    account = Account.lock(true).first 
    account.balance += 500 
    account.save! 
    end 
end 

Es funktioniert tatsächlich, account.balance enthält dann 750, dann 1500 beim nächsten Treffer. Ohne Verriegelung wird nur der letzte Thread berücksichtigt und das Ergebnis ist 500.

Ist das ein dummer Test, um den Unterschied zwischen Locking oder nicht zu testen? I denke, Ich verstehe das Prinzip der Pessimist Verriegelung, aber nicht sicher, obwohl.

Antwort

0

Mit diesem Test können Sie ein pessimistisches Sperrverhalten beobachten. Wenn Sie jedoch Sperren entfernen, wird nicht auf optimistisches Sperren umgeschaltet. Es sperrt überhaupt nicht.

Auch sein mehr idiomatische Sie könnten dies tun:

Thread.new do 
    account = Account.first 
    account.with_lock do 
    account.balance += 250 
    account.save! 
    end 
end 

with_lock startet eine Transaktion und erwirbt eine Sperre in einem Rutsch.

Um das optimistische Sperrverhalten zu beobachten, benötigen Sie das Feld lock_version, das in Ihrem Modell vorhanden sein muss. Rails wird dann die Versionskontrolle automatisch aufzeichnen und ActiveRecord::StaleObjectError bei einem Konflikt werfen.