Понимание уровня изоляции @Transactional в Spring "Сериализуемый"

Я хочу использовать аннотацию Spring @Transactional для предотвращения параллелизма при обновлении записи базы данных. Уровень изоляции "Сериализуемый" претендует на это, но я хочу понять, действительно ли это относится к моим сценариям использования и каковы все последствия этого уровня изоляции. Я не использую JPA, и мы уже используем оптимистическую блокировку (столбец version / timestamp) для длинных разговоров.

  • Если мой запрос прост Update table X where id = 123, будет ли заблокирована только запись 123 во время транзакции или вся таблица X?
  • Если это так, то я думаю о том, чтобы ВСЕ мои обновления, вставки и удаления имели этот уровень изоляции. Я никогда не вижу смысла в том, чтобы разрешать одновременные действия над одной и той же записью, не вызывая проблем. Это чувственно?

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

@Transactional(Isolation = ????)
public String insertUser(User user){
    Integer nextid = query(select id from table ids where tablename = user);
    query(insert in tabel user using nextId);
    query(update table ids set id = (nextId+1) where tablename = user);
}

Я хочу запретить доступ к записи, которая получает идентификатор для table = "user", пока эта транзакция не будет полностью завершена. Какой уровень изоляции покрывает это?

0 ответов

Другие вопросы по тегам