FreeSql (二十八)事务

1、外部事务

在外部开启事务的场景,可使用 WithTransaction 传入事务对象。

await fsql.Update<xxx>()
  .WithTransaction(指定事务)
  .Set(a => a.Clicks + 1)
  .ExecuteAffrowsAsync();

ISelect、IInsert、IUpdate、IDelete,都支持 WithTransaction 方法。

2、同线程事务

同线程事务,由 fsql.Transaction 管理事务提交回滚(缺点:不支持异步),比较适合 WinForm/WPF UI 主线程使用事务的场景。

用户购买了价值100元的商品:扣余额、扣库存。

fsql.Transaction(() =>  {
  //fsql.Ado.TransactionCurrentThread 获得当前事务对象

  var affrows = fsql.Update<User>()
    .Set(a => a.Wealth - 100)
    .Where(a => a.Wealth >= 100).ExecuteAffrows();
    //判断别让用户余额扣成负数
    
  if (affrows < 1)
    throw new Exception("用户余额不足");
    //抛出异常,回滚事务,事务退出

  affrows = fsql.Update<Goods>()
    .Set(a => a.Stock - 1)
    .Where(a => a.Stock >= 1).ExecuteAffrows();
    //判断别让用库存扣成负数
    
  if (affrows < 1)
    throw new Exception("商品库存不足");
    //抛出异常,回滚事务,事务退出
});

同线程事务使用简单,需要注意的限制:

  • 事务对象在线程挂载,每个线程只可开启一个事务连接,嵌套使用的是同一个事务;

  • 事务体内代码不可以切换线程,因此不可使用任何异步方法,包括FreeSql提供的数据库异步方法(可以使用任何 Curd 同步方法);

更多事务方法 UnitOfWork、DbContext 请点击这里,它们不受线程限制并且支持 AOP 事务

系列文章导航

posted @   FreeSql  阅读(9502)  评论(3编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示
主题色彩