ЗАКЛЮЧВАНЕ В РЕЖИМ НА СПОДЕЛЯНЕ ще позволи на 2-ра нишка да прочете стойността, но действителната стойност ще бъде тази преди заявката (прочетено е ангажирано) или преди транзакцията (повтарящо се четене) да бъде стартирана (тъй като MySQL използва мултиверсии; и какво трябва да се види от втората транзакция се определя от нивото на изолация). Така че, ако първата транзакция не е ангажирана в момента на четене, старата стойност ще бъде прочетена.
Във вашия сценарий най-добре е да имате 1 транзакция, която заключва записа с избор за актуализация, друга да не работи върху записа и при комит/връщане, трета отключва записа.
Втората нишка транзакция с select for update ще изчака първата да завърши, след това ще прочете действителната стойност и ще реши да не продължи с другите транзакции, а да информира потребителя, че записът е заключен.
За да избегнете блокиране, уверете се, че правите select for update
използвайки уникален индекс.
Примерен код:
connection.setautocommit(false);
//transaction-1
PreparedStatement ps1 = "Select locked from tableName for update where id="key" and locked=false);
ps1.executeQuery();
//transaction 2
PreparedStatement ps2 = "Update tableName set locked=true where id="key";
ps2.executeUpdate();
connection.setautocommit(true); // here we allow other transactions / threads to see the new value
connection.setautocommit(false);
//transaction 3
PreparedStatement ps3 = "Update tableName set aField="Sthg" where id="key" And date="D" and topic="T";
ps3.executeUpdate();
// probably more queries
// reset locked to false
PreparedStatement ps4 = "Update tableName set locked=false where id="key";
ps4.executeUpdate();
//commit
connection.setautocommit(true);