Задавайте вопросы, мы ответим
Вы не зашли.
Когда разбираешься с логикой работы транзакций с учетом уровней изоляции, возникает вопрос: все что описано в стандарте по 4 уровням выполняется только при условии, что вся логика использует единственный уровень изоляции? Т.е. важно знать, что получится, если работают несколько транзакций на разном уровне. Ведь уровень влияет и на то, как данная транзакция "видна" извне (т.е. публикует ли свои данные до завершения) и на то, как транзакция "видит" внешние данные (напр., создание локальной копии данных при первом обращении и работа с ней, не видя чужих изменений). Вдобавок, наверное, влияет и способ, которым данная СУБД реализует эти самые уровни. Каких правил стоит придерживаться при изменении уровней изоляции в разных модулях (блоки кода, хранимки и т.д.) ? Можно ли смешивать уровни?
Отредактированно shutdown (26.08.2008 14:07:19)
Неактивен
Уровень не влияет на то, как его видят извне - данные все попадают в базу, только либо в виде завершенной транзакции лобо в виде "dirty" данных. Для этого в innodb реализована мультиверсионность. Несколько транзакций могут работать на разных уровнях и не должно быть проблем.
Способ реализации конечно влияет, некоторые случаи могут быть непротестированы. Особенно важный момент - связь уровня изоляции и репликации.
Неактивен
Единственное исключение из этого правила - уровень изоляции SERIALIZABLE, который будет запрещать
изменения некоторых строк другим потокам, которые могут находиться при этом в произвольном (не
обязательно таком же) уровне изоляции.
Неактивен
Т.е. выбирая уровень, нужно исходить только из того, какие изменения, сделанные другими, МЫ хотим видеть в данной транзакции?
Насчет связи с репликацией, где можно посмотреть?
По сути поток репликации должен выполнять запросы как обычный пользователь? В каком уровне изоляции он действует?
Спасибо.
Отредактированно shutdown (02.09.2008 14:33:47)
Неактивен
Бинарный журнал - это уже последовательность запросов на изменение данных, а не набор параллельных транзакций. По логике slave действует на уровне единственного пользователя с autocommit.
О связи с репликацией немного написано в документации: http://mysql2.mirrors-r-us.net/doc/refm … ation.html
Каждый уровень изоляции умеет взаимодействовать с бинлогом по-своему, в принципе все должно работать, но на практике много граничных случаев, как пример - эта бага (уже исправлена): http://bugs.mysql.com/bug.php?id=23051
Неактивен