在 并发中 容易 导致 数据 被 同时 访问 并作修改,如果非要在数据库端执行 解决这种问题,可以使用 以下 并发控制
直接上 例子
using Microsoft.EntityFrameworkCore;
namespace EF_Core07
{
internal class Program
{
static void Main(string[] args)
{
/*
//普通没有加锁 并发 导致的数据错误
Console.WriteLine("请输入您的名字:");
string name = Console.ReadLine();
using (DBcontext db = new DBcontext())
{
House house = db.Houses.Single(e => e.Id == 6);
if (house.UserName == name)
{
Console.WriteLine("你自己已经抢到房子了");
Console.ReadKey();
return;
}
else if (house.UserName != null)
{
Console.WriteLine($"房子已经被{house.UserName}抢到了");
Console.ReadKey();
return;
}
house.UserName = name;
Thread.Sleep(6000);
db.SaveChanges();
Console.ReadKey();
}*/
//使用悲观 并发 控制 防止 并发误操作
Console.WriteLine("请输入您的名字:");
string name = Console.ReadLine();
using (DBcontext db = new DBcontext())
{
//开始 事务
using (var bct = db.Database.BeginTransaction())
{
House house = db.Houses.FromSqlInterpolated($"select * from T_Houses With(RowLock,UpdLock) where id=6").First();
if (house.UserName == name)
{
Console.WriteLine("你自己已经抢到房子了");
Console.ReadKey();
return;
}
else if (house.UserName != null)
{
Console.WriteLine($"房子已经被{house.UserName}抢到了");
Console.ReadKey();
return;
}
house.UserName = name;
Thread.Sleep(6000);
db.SaveChanges();
bct.Commit();
Console.ReadKey();
}
}
}
}
}
了解更多锁 推荐这篇文章 转载于 SQL加锁语句_MsdnWoo的博客-CSDN博客_sql加行锁的语句