У меня есть запрос в LINQ, я хочу получить MAX кода моей таблицы, увеличить его и вставить новую запись с новым кодом. точно так же, как функция IDENTITY SQL Server, но здесь мой столбец Code - это char (5), где могут быть алфавиты и числа.
Моя проблема заключается в том, что при вставке новой строки два параллельных процесса получают максимум и вставляют равный код в запись.
моя команда:
var maxCode = db.Customers.Select(c=>c.Code).Max();
var anotherCustomer = db.Customers.Where(...).SingleOrDefault();
anotherCustomer.Code = GenerateNextCode(maxCode);
db.SubmitChanges();
Я выполнил эту команду через 1000 потоков, и каждый из них обновил 200 клиентов, и использовал транзакцию с IsolationLevel.Serializable, после двух или трех выполнений произошла ошибка:
using (var db = new DBModelDataContext())
{
DbTransaction tran = null;
try
{
db.Connection.Open();
tran = db.Connection.BeginTransaction(IsolationLevel.Serializable);
db.Transaction = tran;
.
.
.
.
tran.Commit();
}
catch
{
tran.Rollback();
}
finally
{
db.Connection.Close();
}
}
ошибка:
Транзакция (идентификатор процесса 60) заблокирована на ресурсах блокировки другим процессом и выбрана в качестве жертвы взаимоблокировки. Повторите транзакцию.
другие IsolationLevels генерируют эту ошибку:
Строка не найдена или изменена.
Пожалуйста, помогите мне, спасибо.
UPDATE2: у меня есть метод .NET, генерирующий новый буквенно-цифровой код. UPDATE3: Моя функция .NET генерирует такой код: 0000, 0001, 0002,..., 0009, 000a, 000b, 000c,..., 000z, 0010, 0011, 0012,..., 0019, 001a, 001b , 001з, ... ...
using (var tran = BeginTran()) { tran.Commit(); }
- person Steven   schedule 26.05.2010