Подтвердить что ты не робот

Зачем устанавливать Autocommit в true?

Я давно задавался вопросом, почему API JDBC предоставляет режим автосохранения (java.sql.Connection.setAutocommit()). Кажется, это привлекательная неприятность, которая просто завлекает людей в неприятности. Моя теория заключается в том, что она добавлена ​​только в JDBC, чтобы упростить жизнь для поставщиков, которые хотели создать инструменты для редактирования и запуска SQL с использованием JDBC. Есть ли другая причина включить автокоммит, или это всегда ошибка?

4b9b3361

Ответ 1

К сожалению, использование autocommit зависит от конкретной базы данных (как и поведение транзакции). Я думаю, что если у вас нет глобальной стратегии программных транзакций, автокоммит, вероятно, лучше, чем просто надеяться, что все правильно закрывают/откатывают транзакции.

Говоря о MySQL, вы можете оставить autocommit = true по умолчанию, и он автоматически отключит это, когда вы НАЧАТЬ транзакцию. Единственная причина для установки autocommit = false - это если вы хотите принудительно вызвать ошибку, если кто-то пытается начать транзакцию без BEGIN.

Для простоты типичного приложения Java + MySQL сегодня я бы более или менее игнорировал параметр автоматической фиксации, использовал шаблон open-session-in-view и называл его хорошим.

Я бы сильно отказался от явных блокировок строк RDBMS и вместо этого использовал оптимистичные блокировки. Hibernate предлагает встроенную поддержку оптимистичных замков, но это простой способ учесть даже для ручного проката и обеспечивает лучшую производительность.

Ответ 2

Единственная разумная причина, по которой я вижу, - избавиться от шаблона connection.commit() и connection.rollback() в простых транзакциях с одним запросом в небольших приложениях. JDBC в сырой форме требует от себя уже много шаблонов. Каждая строка меньше делает JDBC менее страшным для начинающих.

Ответ 3

Я почти всегда запускаю autocommit = true. 99% времени, мои обновления являются атомарными. Конечно, бывают случаи, когда вы пишете дебет и затем не пытаетесь написать кредит, который хотите откат. Но, по моему опыту, они относительно редки. Обычно каждая запись, которую я пишу, стоит сама по себе. В этом случае вам не нужно беспокоиться о совершении фиксации после каждой записи. Он сохраняет строку кода здесь и там. Это может сэкономить больше, если, учитывая структуру программы, это означает, что мне не нужен дополнительный блок try/catch или мне не нужно передавать объект соединения между функциями. Это спасает от раздражающих ошибок, когда кто-то забыл сделать фиксацию.

Единственный способ понять, что он может "заманить кого-то в неприятности", - он решает, что отключение автокоммутации и выполнение фиксации или отката - это слишком много проблем, и поэтому он делает обновления, которые должны быть в рамках транзакции индивидуально. Затем все срабатывает нормально, пока ничего не происходит, что должно прервать транзакцию. Если тестовые сценарии неадекватны, я могу представить, что это ускользнуло в производство.

Но вы можете сказать то же самое о почти любой функции языка. Например, предположим, что вы пишете программу, которая обрабатывает числа, которые в 90% случаев будут вписываться в длинный, но время от времени может быть больше. Столкнувшись с этой ситуацией, нужно сделать так, чтобы использовать BigInteger или создать новый класс для обработки больших чисел. Ленивого программиста можно заманить в использование долго, потому что он обычно работает, а другие альтернативы - слишком большие проблемы. Не могли бы вы заключить, что Java не должен включать long (или int), потому что кто-то может быть привлечен к использованию, когда они не подходят?

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

Ответ 4

Автоматическая фиксация удобна; но с изменениями спецификации JDBC 3 стал намного менее полезным.

Поскольку JDBC 3connections в режиме "auto-commit" не может открывать более одного оператора. Выполнение другого оператора закрывает первое - включая любой ResultSet.

Таким образом, цикл в SELECT и выдача UPDATE (или даже вложенных SELECT) будут терпеть неудачу. По-видимому, это преступление, на самом деле хотите что-то сделать с результатами вашего внешнего SELECT!


В любом случае, зависит от конкретного драйвера и версии.. но в целом спецификация JDBC 3, похоже, требует этого бесполезного поведения. Модернизация драйверов также может бесполезно "обнаружить" это поведение.

Зачем использовать auto-commit? Первоначально это было полезно и удобно. Как говорят другие ответы, JDBC требует, чтобы набралось достаточное количество GUFF и HANDLING. JDBC - это не очень хорошо разработанный API: (


В эти дни вам лучше использовать Hibernate или Spring JdbcTemplate.. И если вы делаете сервлеты/веб-приложения, поместите управление транзакциями (начало/конец) или сеанс Hibernate (привяжите его к потоку- локальный) на границах "Пользовательского запроса".

например, получить привязку вашего соединения/транзакции в начале ServletRequest; и верните его в конце.

Вы можете использовать файл javax.servlet.Filter или аналогичный и привязать его к локальному потоку, сделать статический помощник, чтобы получить его или потребовать его, и т.д.

Ответ 5

Commit-mode изменяет способ блокировки db.

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

...

Чтобы избежать конфликтов во время транзакции, СУБД использует блокировки, механизмы блокировки доступа других к данным, к которым осуществляется транзакция. (Обратите внимание, что в режиме автоматической фиксации, где каждый оператор является транзакцией, блокировки сохраняются только для одного оператора.)

http://download.oracle.com/javase/tutorial/jdbc/basics/transactions.html

Ответ 6

95% кодовой базы, с которой я работаю, теперь включает в себя однократные обновления, где наличие autocommit вполне разумно. Итак, мы по умолчанию на нем. Просто выключите его достаточно долго, чтобы сделать разделы кода, которые должны быть транзакцией, а затем автоматически запустите autocommit!

Ответ 7

Ну, есть определенные условия, которые требуют тщательного просмотра, позволяя "автообновлять" на глобальном уровне:

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

b.) Помните, что при отказе "автообмена" откат не отменяется.

c.) Это также накладные расходы на запись (фиксацию) каждой транзакции.

d.) Для запросов только для чтения нет явной потребности в "автоматической фиксации", но, включив "автоматическую фиксацию", она автоматически применяется для всех запросов.

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