/ / Как да приложа състоянието на състезанието на ниво база данни с пролет и зимен сън? - java, пролет, оракул, зимен сън, състезателна кондиция

Как да внедрим състоянието на състезанието на ниво база данни с Пролет и хибернация? - ява, пролет, оракул, хибернация, състояние на състезанието

Имам банков проект, който клиентът балансиратрябва да се актуализира с паралелни нишки в паралелни приложения. Съхранявам баланси на клиенти в база данни на Oracle. Моите java приложения ще бъдат реализирани с Spring and Hibernate.

Как мога да прилагам състоянието на състезанието между паралелни приложения? Трябва ли моето решение да бъде на ниво база данни или на ниво приложение?

Отговори:

1 за отговор № 1

Предполагам, че това, което бихте искали да знаете, е как да се справите с едновременността, предотвратяване условия за състезания, които могат да възникнат, когато две части на приложението променят и случайно презапишат едни и същи данни.

Имате най-вече две стратегии за това: песимистично заключване и оптимистично заключване:

Песимистично заключване

тук предполагате, че вероятността, че двенишките презаписват едни и същи данни е високо, така че бихте искали да го обработва по прозрачен начин. За да се справите с това, увеличете нивото на изолация на вашите Spring операции от стойността по подразбиране на READ_COMMITTED например REPEATABLE_READ което в повечето случаи трябва да е достатъчно:

@Transactional(isolation=Isolation.REPEATABLE_READ)
public void yourBusinessMethod {
...
}

В този случай, ако прочетете някои данни вВ началото на метода сте сигурни, че никой не може да презапише данните в базата данни, докато вашият метод продължава. Имайте предвид, че все още е възможно друга нишка да вмъкне допълнителни записи към заявка, която сте направили (проблем, известен като фантомни четения), но не и да променя записите, които вече сте чели.

Ако искате да се защитите от фантомни четения, трябва да надстроите нивото на изолация до SERIALIZABLE, Подобрената изолация идва с цена за ефективност, програмата ви ще работи по-бавно и по-често ще „виси“ в очакване на другата част от програмата да приключи.

Оптимистично заключване

Тук предполагате, че са сблъсъци за достъп до даннирядко и че в редки случаи те се появяват, те лесно се възстановяват чрез приложението. В този режим запазвате всичките си бизнес методи по подразбиране REPEATABLE_READ режим.

Тогава всяко хибернационно образувание се маркира с колона с версия:

@Entity
public SomeEntity {
...
@Version
private Long version;
}

С това всяко едно четене от базата данни еверсиониран с помощта на колоната с версии. Когато Hibernate напише промени в субекта в базата данни, той ще провери дали версията е увеличена от последния път, когато транзакцията прочете субекта.

Ако е така, това означава, че някой друг е променил данните и решенията, когато са взети с използване на застояли данни. В този случай a StaleObjectException се хвърля, което трябва да бъде хванато от приложението и да се обработва, в идеалния случай на централно място.

В случай на GUI, можете да хванете изключението, покажете съобщение, което казва user xyz changed this data while you where also editing it, your changes are lost. Press Ok to reload the new data.

С оптимистично заключване вашата програма ще работипо-бързо, но приложенията трябва да се справят с някои аспекти на съвместимостта, които в противен случай биха били прозрачни с песимистично заключване: версии, създаване на изключения.

Най-често използваният метод е оптимистичензаключване, както изглежда, че е приемливо в повечето приложения. С песимистичното заключване е много лесно да се създадат проблеми с производителността, особено когато сблъсъците за достъп до данни са редки и могат да бъдат решени по прост начин.

Няма ограничения за смесване на използването на двата метода за обработка на паралелността в едно и също приложение, ако е необходимо.