Вы очень , очень уверены, что вы установили TX для сериализации? Потому что это никогда не должно происходить в сериализуемой транзакции.
Если два TX читают и изменяют одну и ту же строку в сериализуемой транзакции, то оракул выдает ORA-08177 .
Пожалуйста, проверьте, что Hibernate фактически устанавливает TX как сериализуемый.
Редактировать
Вы можете сделать то, что предложил Jonas, или вы также можете проверить это в своем приложении, получив базовое соединение и вызвав Connection.getIsolationLevel (). Например
Connection c = session.connection()
int level = c.getIsolationLevel()
Редактировать 2
Хорошо, поскольку вы подтвердили, что уровень изоляции в соединении SERIALILIZABLE, вы можете проверить:
- Что таблицы используют механизм innoDB.
- Как предложил Джонас, запустите
SELECT @@tx_isolation;
из своего кода, пока он находится в транзакции. Он должен вернуть SERIALIZABLE . Это нужно для проверки того, что Соединение действительно распространяет уровень изоляции. Это немного параноидально, но что делать ...
- Убедитесь, что ваш код открывает только одну транзакцию и выполняет все в этой передаче. Я только что проверил уровень изоляции SERIALIZABLE вручную, и он работает как положено (он блокирует любой TX, пытающийся прочитать ту же строку).
- Последнее средство: убедитесь, что уровень изоляции SERIALIZABLE работает в вашей установке MySQL.
ПРИМЕЧАНИЕ : Как я упоминал ранее, MySQL блокирует любые запросы, пытающиеся читать из одной и той же строки. Это означает, что если у вас есть несколько «общих таблиц», таких как страна, компания, пользователь и т. Д., Которые многие TX читают одновременно, это может заставить ваше приложение работать почти последовательно, а не параллельно.