Вам необходимо решить, выполняете ли вы транзакции или нет.
Важно понимать, как работают серверы SQL, не существует такой вещи, как транзакции.То, что autoCommit = true делает каждый оператор самостоятельной транзакцией, вам не нужно использовать явные BEGIN TRANSACTION
и COMMIT
вокруг каждого оператора (SQL-сервер подразумевает такое поведение).
Да ... важно, чтобы вы делали SELECT внутри транзакции.Тот факт, что вы полагаете, что в этом нет необходимости, указывает на то, что вы еще не до конца понимаете и понимаете смысл реляционной целостности.
Hibernate ожидает, что реляционная целостность будет существовать, если вы сейчас читаете некоторые данные, затем запускаете некоторый код Java, а затемиспользуйте ранее прочитанные данные для доступа к большему количеству данных из SQL (например, с помощью функции отложенной загрузки Hibernates), тогда важно, чтобы данные все еще существовали, не так ли.Иначе, что должен делать ваш Java-код сейчас?выдать пользователю ошибку?
Это то, что при использовании транзакций, скажем, по умолчанию READ_COMMITTED
Уровень изоляции транзакций обеспечит, и это минимальный уровень, который вы должны начать свой квест для получения (изучения) SQL.
Так вы делаете транзакции или нет.Вопрос в том, хотите ли вы последовательного, надежного, повторяемого поведения или вы быстро, но иногда сумасшедший?(это не означает, что транзакции снижают производительность, это распространенное заблуждение, только транзакции, конфликтующие друг с другом, могут снизить производительность, а работа с большими наборами данных в открытой транзакции увеличивает возможность снизить производительность).
Re autoCommit = true | false, влияющий на производительность.Я думаю, что вы задаете неправильный вопрос.
Повторная блокировка баз данных из-за длительных транзакций, обычно это ошибка проектирования кода / кода, иногда это проблема проектирования, связанная с действиями в SQL,Многие транзакции с маленькими наборами данных хороши, а один большой большой - плохо.
.
Чтобы получить поддержку транзакций в MySQL, вы должны убедиться, что все ваши таблицы имеют тип InnoDB, используя "CREATE TABLE tableName ( ... ) ENGINE=InnoDB;"
.
Необходимо сохранить драйвер SQL, дескриптор пула соединения (через c3p0) с autoCommit=false
(это должно быть по умолчанию).
Вы должны убедиться, что уровень изоляции транзакции по умолчанию равен(по крайней мере) READ_COMMITTED
.
Не забудьте использовать правильный диалект Hibernate для InnoDB (проверьте выходные данные журнала запуска Hibernate).
Теперь узнайте, как это использовать.Если вы столкнулись с проблемой, это потому, что вы делаете что-то не так и не до конца понимаете.Если вы чувствуете, что вам нужно снизить уровень изоляции, прекратить использование транзакций или вам нужно autoCommit=true
, тогда вам следует серьезно нанять профессионального консультанта, чтобы посмотреть на проект, и не стоит рассматривать его выключение, пока вы не поймете, почему и когда вы можете отключить его..
.
Обновление после редактирования
Параметр autoCommit по умолчанию является свойством драйвера и / или пула подключения.Так что я предлагаю не связываться с настройкой гибернации, с чего бы я не начал.
По умолчанию hibernate проверяет, что он получает, и модифицирует его при необходимости.Затем put возвращается к тому, что было до возвращения Соединения в пул соединений (некоторые разорванные пулы соединений не проверяют / сбрасывают это, поэтому hibernate делает это для улучшения взаимодействия в более крупной системе).
Так что, если это поможет с настройкой пула соединений (c3p0), то, возможно, вам следует начать с публикации подробностей о том, как вы его настроили?Используемая версия, а также пример используемой строки подключения JDBC, а также используемый вами JAR-драйвер MySQL.
И каков сценарий развертывания?автономный J2SE?веб-приложение WAR?сервер приложений?
Можете ли вы написать тестовый код, чтобы получить соединение, и есть API, чтобы спросить его, что это за режим autoCommit.http://download.oracle.com/javase/6/docs/api/java/sql/Connection.html#getAutoCommit%28%29 Ваша цель состоит в том, чтобы затем настроить свою конфигурацию так, чтобы вы всегда получали «false» из этого API.
Документация по драйверу MySQL http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html там есть ссылка на autoCommit.
Вы также хотите попытаться запустить «переменные mysqladmin» на своем сервере, чтобы вернуть конфигурацию сервера, возможно, можно установить ее глобально (что кажется ИМХО глупым занятием).
Короче говоря, вам нужно найти источник его установки, так как это необычное значение по умолчанию. Тогда вы можете удалить его.