当前位置: 首页> 房产> 家装 > ppt模板简约_3d效果图用什么软件_官网建设_做推广的都是怎么推

ppt模板简约_3d效果图用什么软件_官网建设_做推广的都是怎么推

时间:2025/7/12 3:10:29来源:https://blog.csdn.net/lei1083929965/article/details/146606600 浏览次数:0次
ppt模板简约_3d效果图用什么软件_官网建设_做推广的都是怎么推

文章目录

  • 前言
  • 一、悲观并发控制的核心思想
  • 二、实现步骤
    • 1)针对SQL Server数据库
    • 2)针对MySQL数据库
  • 三、不同数据库的锁语法
  • 四、注意事项
  • 五、适用场景
  • 六、与乐观并发的对比
  • 总结


前言

Entity Framework (EF) Core 默认主要支持 乐观并发控制(通过并发令牌或 RowVersion),而 悲观并发控制 需要开发者手动实现(通常借助数据库事务和锁机制

一、悲观并发控制的核心思想

操作数据前 显式锁定资源(如行锁表锁),阻止其他事务修改,直到当前事务完成。通常通过数据库的锁机制实现。

二、实现步骤

  1. 开启事务
    使用 BeginTransactionBeginTransactionAsync 开启事务。
  2. 显式加锁查询
    使用 FromSqlRawFromSqlInterpolated 编写原生 SQL 查询,指定锁机制(如 UPDLOCK)。
  3. 操作数据
    在事务内修改数据,此时锁保持有效。
  4. 提交事务
    提交后释放锁。(trans.Commit();)

1)针对SQL Server数据库

  1. 示例

    using (var transaction = context.Database.BeginTransaction())
    {try{// 查询并锁定目标行(SQL Server 使用 UPDLOCK)long houseId = 1;var house = context.Houses.FromSqlInterpolated($"SELECT * FROM T_Houses WITH (UPDLOCK) WHERE Id = {houseId}").FirstOrDefault();if (string.IsNullOrEmpty(house.Owner)){// 修改数据house.Owner = paramName;context.SaveChanges();}// 提交事务,释放锁transaction.Commit();}catch (Exception){transaction.Rollback();throw;}
    }
    

2)针对MySQL数据库

  1. 示例:

    Console.WriteLine("请输入名字");
    string name=Console.ReadLine();
    using (MyDBContext dbContext=new MyDBContext())
    using (var trans=dbContext.Database.BeginTransaction())
    {Console.WriteLine($"{DateTime.Now}-准备select for Update");var house=dbContext.Houses.FromSqlInterpolated($"select * from T_Houses where Id=1 for update").Single();Console.WriteLine($"{DateTime.Now}-完成select for Update");if (!string.IsNullOrEmpty(house.Owner)){if (house.Owner==name){Console.WriteLine("此房源已被您抢到");}else{Console.WriteLine($"此房源已被{house.Owner}抢占");}trans.Commit();Console.ReadLine();        return;}house.Owner=name;Thread.Sleep(5000);Console.WriteLine($"恭喜{name}抢到了房源{house.Name}");dbContext.SaveChanges();trans.Commit();Console.ReadLine();
    }
    

三、不同数据库的锁语法

  1. SQL Server: WITH (UPDLOCK) 或 WITH (ROWLOCK)
  2. PostgreSQL: SELECT … FOR UPDATE
  3. MySQL: SELECT … FOR UPDATE

四、注意事项

  1. 事务范围
    保持事务尽可能短,避免长时间锁定导致性能问题。
  2. 死锁风险
    确保锁定顺序一致,减少死锁概率。
  3. 数据库兼容性
    不同数据库的锁语法和行为可能不同,需参考具体数据库文档。

五、适用场景

  1. 高竞争环境(如库存扣减、抢购)
  2. 需要强制串行化操作的场景

六、与乐观并发的对比

悲观并发乐观并发
实现方式显式加锁(事务+锁机制)版本检查(并发令牌、RowVersion)
性能高竞争时可能更高效低冲突时更高效
复杂度需要手动管理锁和事务EF Core 内置支持

总结

EF Core 实现悲观并发需通过数据库锁和事务手动控制。虽然灵活,但需谨慎处理锁的范围和事务生命周期,避免性能问题。如果业务允许,优先考虑乐观并发(如 ConcurrencyCheck 特性或 RowVersion)。

关键字:ppt模板简约_3d效果图用什么软件_官网建设_做推广的都是怎么推

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: