JPA / Hibernate Optimisti c блокировка по версии в сценарии вставки - PullRequest
0 голосов
/ 14 января 2020

У меня есть таблица с балансами клиентов.

| Customer_Id | Request_Id | Blance | Request_Date |

Каждый запрос, поступающий в приложение, я выбираю последний запрос, считываю его баланс, выполняю некоторый процесс и, наконец, вставляю новая запись в таблице с новым балансом (Old Balance - Request Amount). Моя задача состоит в том, чтобы при моем сценарии поступили два запроса от одного клиента, и в этом случае произошел параллелизм и, наконец, была вставлена ​​запись с неправильным балансом. Я знаю, что оптимальная блокировка c в идеале помогает в обновлении сценария ios, но наша система является устаревшим приложением, и я не могу изменить поведение системы.

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Вы можете управлять блокировкой optimisti c, используя @Version.

Пример : Active optimisti c Управление блокировками для тестовой таблицы .

@Entity
@Table(name = "TEST")
public class TestEntity {

    private Long id;
    private String name;

    @Version
    private Long version;

   //getter and setters
}

Дополнительная информация о блокировке Optimisti c в JPA

Используя эту аннотацию, Оптимистический c -lock будет автоматически управляться системой, и вам ничего не нужно делать.

Обратите внимание, что , если ваша таблица полна данных, и она невозможно удалить и создать его снова, необходимо добавить в таблицу столбец версия (по собственному запросу).

0 голосов
/ 14 января 2020

Если вы не можете использовать оптимист * Блокировка c не подходит из-за устаревшей природы вашей системы, вы все равно можете использовать блокировку c pesimisti с JPA - Фактическое использование зависит от вашей реализации . В качестве альтернативы вы можете заблокировать строки, которые вы хотите обновить, с помощью NATIVE QUERY - например, в Oracle вы можете использовать SELECT ... FOR UPDATE:

SELECT ... FROM ... WHERE Customer_Id = ... FOR UPDATE
...