Мы используем NHibernate, чтобы обновить таблицу счетов с балансом для пользователя. Один контрольный пример, который блокирует нас:
var s = NHibernateHelper.OpenSession();
var q = s.CreateQuery("Update Account set Balance=? where UserId=? and Version=?");
var acc = s.Load(1);
ITransaction tx = null;
for (int j = 0; j < NUM_UPDATES; j++)
{
int rowcount = 0;
var tx = s.BeginTransaction();
do
{
s.Refresh(acc);
q.SetDouble(0, acc.Balance + _amount).SetInt32(1, 1).SetBinary(2, acc.Version);
rowcount = q.ExecuteUpdate();
} while (rowcount <= 0);
tx.Commit();
}
этот код выполняется как в одном потоке, так и в нескольких потоках одновременно (следовательно, управление версиями). он выполняется правильно, но - номер версии увеличивается на число, которое больше фактического количества обновлений (NUM_UPDATES) на некоторое значение.
например. если мы делаем 16 обновлений, номер версии увеличивается на 16 или 17. Если мы делаем 1000 обновлений, номер версии увеличивается на 1004.
Если 16 потоков выполняют один и тот же код (на 4-ядерном компьютере) с 1000 обновлений в каждом, то мы, очевидно, получим много попыток, и версия будет увеличена на 16064 (1004 * 16).
Есть идеи, что вызвало это? Есть ли причина для тревоги?