Первоначально я использовал Nhibernate с MSSQL (2008), и все работало отлично. У меня было веб-приложение, которое связывало сеанс для каждого запроса и упаковывало каждую единицу работы в транзакцию. Транзакции были введены через AOP и пользовательский атрибут, поэтому все с требуемым атрибутом будет заключено в транзакцию, которая либо завершилась фиксацией, либо откатом.
Опять же, просто чтобы уточнить, что все хорошо работает в MSSQL, и с помощью Nhibernate Profiler я вижу, что все транзакции происходят, как и ожидалось.
Теперь я только что добавил поддержку Mysql (5.1) (поскольку в одной среде используется база данных Mysql), я настроил все таблицы как InnoDB, и структуры таблиц идентичны, поэтому я немного озадачен, почему я получить следующую ошибку:
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [SomeRandomEntity#1]Could not synchronize database state with session
При проверке на профилировщике Nhibernate он начинает транзакцию, запускает вызов обновления, а затем выполняет бомбардировку с ошибкой, тогда как в действительности он должен быть зафиксирован в этот момент.
Если это помогает, SQL запускается при обновлении (имена изменены):
UPDATE
some_table SET some_column_1 = 1230697028 /* ?p0 */,
some_column_2 = '2011-07-21T10:58:59.00' /* ?p1 */
WHERE some_column_3 = 1 /* ?p2 */
Стоит также отметить, что я не использую какой-либо уровень изоляции в своих транзакциях, я не был уверен, какой из них будет лучшим для моей настройки, и Mssql не жаловался, когда я его не устанавливал.
Кто-нибудь видел подобные проблемы раньше, так как на данный момент это остановка шоу: (
=== Редактировать ===
Если это поможет, вот моя строка подключения:
<connectionStrings>
<add name="NHibernateConnection" connectionString="Server=localhost;Database=xxxxx;Uid=root;" providerName="System.Data.SqlClient"/>
</connectionStrings>