2013-04-23 3 views
3

Если я установил соединение с ручной фиксацией, значит ли это, что мой процесс заблокирует базу данных? Если мне нужно выполнить несколько SQL-запросов, которые, возможно, заработают 4-5 часов, означает ли это, что в то время никакой другой пользователь не получит доступ к моей базе данных?Каков эффект отключения автоматической фиксации соединения с базой данных?

Я использую сценарий веб-приложения, в котором тысячи пользователей обращаются к одной базе данных.

connection.setAutoCommit(false); 
//multiple sql query that will probably take 4-5 hours to be executed 

connection.commit(); 
+1

Но кто отвечает за настройку уровня изоляции транзакций по умолчанию? Может быть, выбранный разъем db? (этот вопрос был для другого комментария, который был удален) – cahen

ответ

5

Установка autocommit на false обычно не влияет на чтение, поэтому, если это то, что вы выполняете, не должно быть проблемой.

Что означает autocommit = false, заключается в том, что вы выполняете свои запросы (вставки, удаления, обновления) в транзакции, а это означает, что все они будут успешными (с фиксацией в конце) или сбой , и откат.

При вставке, обновлении или делать select ... for update, некоторые строки будут заблокированы, и это труднее предсказать, поскольку она зависит от вашего двигателя, Mysql версии, уровень изоляции и т.д.

Если , например, autocommit = false, и двум пользователям необходимо одновременно обновлять одни и те же строки, тогда один будет заблокирован в ожидании завершения первого, с фиксацией или откатом.

Скажем, USER1 запускает обновление вашей базы данных, которое будет нацелено на 10 строк.

Вы начинаете транзакцию, сделать обновление, сделать несколько больше запросов ...

До фиксации/отката, ПОЛЬЗОВАТЕЛЬ2 вызывает то же самое обновление или обновление, которое будет предназначаться для одного или более из те же строки, что и USER1 обновляется.

ПОЛЬЗОВАТЕЛЬ2 будет заблокирован, ожидая USER1 либо фиксации или отката, до того, как обновление может быть выполнено.

Один из способов тестирования заключается в открытии двух разных подключений к базе данных, например, через командную строку или другого клиента и имитации этого поведения. Установите autocommit на false, сделайте обновление на одном клиенте, сделайте то же самое на втором, и увидите, что он зависает там до тех пор, пока вы не совершите или откатите первый клиент.

Этот метод может быть очень удобным, чтобы помочь вам понять, что происходит за кулисами.

6

connection.setAutoCommit (false); означает, что вы начинаете транзакцию по этому соединению. Все изменения, которые вы будете делать с таблицами БД в этом соединении, будут сохранены при фиксации или возврате при откате (или отключении без фиксации). Это не означает, что вы блокируете всю БД. Будут ли другие пользователи заблокированы, пытаясь получить доступ к таблицам, используемым вами для транзакций, будет зависеть от операций, выполняемых вашей транзакцией, и уровня изоляции транзакции.

0

Это зависит от уровня изоляции и то, что вы делаете:

Если вы читаете:

  • Грязные чтения/чтения поручены: Никакие другие задачи не будут затронуты
  • Повторяется Read: Другое задачи чтения не будут затронуты. Другие проблемы с записью могут быть затронуты. (Зависит от реализации)
  • Сериализация: Другие задачи чтения не будут затронуты, написание будет.

Если вы выполняете обновления, будут затронуты другие задачи. Вообще говоря, вы не должны делать обновления в длительных транзакциях.

Смежные вопросы