我在 LINQ 中有一个查询,我想获取我的表的 MAX 代码并增加它并用新代码插入新记录。就像 SQL Server 的 IDENTITY 功能,但这里我的代码列是 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 的 Transaction,执行两三次后发生错误:
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();
}
}
错误:
事务(进程 ID 60)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务。
其他 IsolationLevels 生成此错误:
未找到或更改行。
请帮帮我,谢谢。
UPDATE2:我有一个生成新代码的.NET 方法,它是字母数字的。UPDATE3:我的 .NET 函数生成如下代码:0000、0001、0002、...、0009、000a、000b、000c、...、000z、0010、0011、0012、...、0019、001a、001b , 001z, ... ...