Optimisti c блокировка без поля версии - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть таблица с полем состояния

CREATE TABLE `new_table` (
  `id` BIGINT(11) NOT NULL,
  `name` varchar(45) NOT NULL,
  `value` int(11) NOT NULL DEFAULT '0',
  `status` varchar(45) NOT NULL
) ENGINE=InnoDB DEFAULT;

Статус может иметь такие значения, как

 DRAFT, POSTED, DELTED

Я хочу реализовать блокировку, чтобы только одна транзакция могла обновлять статус в один раз. Я использую java и JDB c. Ниже приведен конвертированный sql из моего кода.

start transaction;
update db_example.new_table set value=100, status='POSTED' where name="b" and status='DRAFT';
commit;

Код:

myRepo.executeInTransaction(()->{
  Update update = new Update();
  update.set("value", 100);
  update.set("status", "POSTED);
  Criteria criteria = TSqlUtils.newCriteria("name");
  criteria.is("b").and("status").is("DRAFT");
  // DO something in another table 
  ...
  // 
  int count = this.mysqlDao.update(this.getJdbcTemplate(), Query.from(criteria), update, MyObject.class);
  if(count == 0){
    throw new TException("Conflicting transaction");
  }
});

Если я проверяю только на основе статуса, достаточно ли этого для блокировки?

1 Ответ

0 голосов
/ 10 февраля 2020

Похоже, вам сначала нужно определиться с бизнес-требованиями. Если два потока решают обновить статус одновременно, что должно произойти?

Например, последний выигрыш модификатора является распространенным решением. Другое решение может состоять в том, чтобы отказаться от второй модификации и вернуть информативную ошибку во второй процесс.

Как только это отсортировано, код, естественно, следует.

...