COMMIT ИЛИ conn.setAutoCommit(правда)
Я заметил, что некоторые программисты используют COMMIT
другое использование conn.setAutoCommit(true);
завершить транзакцию или выполнить откат, в чем преимущества использования одного вместо другого?
Где главное отличие?
conn.setAutoCommit(true);
над
statement.executeQuery(query);
statement.commit();
2 ответа
Вы должны в целом использовать Connection.commit()
и не Connection.setAutoCommit(true)
совершить транзакцию, если вы не хотите переключаться с использования транзакции на модель autoCommit "транзакция на оператор".
Это сказал, позвонив Connection.setAutoCommit(true)
в то время как в транзакции совершит транзакцию (если драйвер соответствует разделу 10.1.1 спецификации JDBC 4.1). Но вам действительно следует делать это только в том случае, если вы хотите оставаться в autoCommit после этого, поскольку включение / отключение autoCommit в соединении может привести к более высоким издержкам соединения, чем просто фиксация (например, из-за необходимости переключения между менеджерами транзакций выполните дополнительные проверки)., так далее).
Вы также должны использовать Connection.commit()
и не использовать собственную команду SQL COMMIT
, Как подробно описано в документации по подключению:
Примечание. При настройке соединения приложения JDBC должны использовать подходящий метод соединения, такой как setAutoCommit или setTransactionIsolation. Приложения не должны вызывать команды SQL напрямую, чтобы изменить конфигурацию соединения, когда доступен метод JDBC.
Дело в том, что такие команды, как commit()
а также setAutoCommit(boolean)
может делать больше работы на заднем плане, как закрытие ResultSets
и закрытие или сброс Statements
, Использование команды SQL COMMIT
обойдёт это и потенциально приведёт ваш драйвер / соединение в неверное состояние.
Использование conn.setAutoCommit();
применяется к соединению и дает вам возможность выполнить X запросов в одной транзакции или использовать одну транзакцию для execute
Как описывает API:
void setAutoCommit(boolean autoCommit)
throws SQLException
Устанавливает режим автоматической фиксации этого соединения в заданное состояние. Если соединение находится в режиме автоматической фиксации, все его операторы SQL будут выполняться и фиксироваться как отдельные транзакции. В противном случае его операторы SQL группируются в транзакции, которые завершаются вызовом метода commit или отката метода. По умолчанию новые подключения находятся в режиме автоматической фиксации
Для простого случая:
conn.setAutoCommit(false);
statement.executeQuery(query);
statement.commit();
будет таким же как:
conn.setAutoCommit(true);
statement.executeQuery(query);