Какой уровень изоляции использовать в базовом проекте MySQL? - PullRequest
3 голосов
/ 17 сентября 2011

Что ж, я получил задание [мини-проект], в котором одним из наиболее важных вопросов является согласованность базы данных.Проект представляет собой веб-приложение, которое позволяет нескольким пользователям получать к нему доступ и работать с ним.Я могу ожидать одновременного запроса и обновления запросов в небольшой набор таблиц, некоторые из которых соединены одна с другой (используя FOREIGN KEYS).

Чтобы поддерживать базу данных максимально согласованной, нам посоветовалииспользуйте уровни изоляции.Прочитав немного (может быть, недостаточно?) О них, я понял, что самые полезные для меня - READ COMMITTED и SERIALIZABLE.

Я могу разделить запросы на три вида:

  1. Выборочный запрос
  2. Обновление запроса
  3. Комбо

Для первого мне нужны данные, чтобы они были согласованными, конечно, я не хочу представлять грязныеданные или незафиксированные данные и т. д. Поэтому я подумал использовать READ COMMITTED для этих запросов.Для запроса на обновление я подумал, что использование SERIALIZABLE будет лучшим вариантом, но, прочитав немного, я обнаружил, что потерян.В комбо, мне, вероятно, придется читать из БД и решать, нужно ли мне / можно ли обновлять, эти 2-3 вызова будут происходить по одной транзакции.

Хотел попросить советакакой уровень изоляции использовать в каждом из этих вариантов запроса.Должен ли я даже рассмотреть различные уровни изоляции для каждого типа?или просто придерживаться одного?

Я использую MySQL 5.1.53 вместе с драйвером MySQL JDBC 3.1.14 (Требования ... Не выбрали версию JDBC)

Ваше мнениеочень ценятся!

Редактировать:

Я решил, что буду использовать REPEATABLE READ , который кажется уровнем по умолчанию.Я не уверен, что это правильный способ, но я думаю REPEATABLE READ вместе с LOCK IN SHARE MODE и FOR UPDATE для запросов должны работатьхорошо ...

Что вы, ребята, думаете?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Я бы предложил READ COMMITTED.Кажется естественным иметь возможность видеть зафиксированные данные других сессий, как только они зафиксированы.

Непонятно, почему в MySQL по умолчанию установлен REPEATABLE READ.

0 голосов
/ 15 октября 2011

Я думаю, вы слишком беспокоитесь об уровне изоляции.

Если у вас есть несколько таблиц для обновления, вам нужно сделать:

START TRANSACTION;
  UPDATE table1 ....;
  UPDATE table2 ....;
  UPDATE table3 ....;
COMMIT;  

Это важные вещи, уровень изоляции просто подливка.

Уровень повторного чтения по умолчанию подойдет для вас.

Обратите внимание, что select ... for update заблокирует таблицу, это может привести к тупикам, что хуже, чем проблема, которую вы, возможно, пытаетесь решить. Используйте этот только если вы удаляете строки в вашей БД.

Если честно, я редко вижу, как строки удаляются в БД, если вы просто делаете обновления, то просто используете обычные операции выбора.

В любом случае см .: http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...