У меня есть таблица с полем состояния
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");
}
});
Если я проверяю только на основе статуса, достаточно ли этого для блокировки?