.Net5 框架搭建(二):事务

前言

用过数据库客户端操作的小伙伴都应该知道开始事务,提交事务等等这些操作,那么代码中怎么实现事务呢,往下看

认识事务

1、概念
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

2、应用场景
举个业务例子,小张要转账给小李100元,那么正常这时候数据库是不是要做两件事情,第一件是小张账号余额减100,第二件是小李账号增加100元。那假如小张在扣钱的这个过程中数据库因某些原因导致失败了,那么小李那边的账号操作就应该直接取消了。

在这里插入图片描述

实现事务操作

.net 实现事务的方式用很多种,发现这篇文章介绍得很全面,推荐大家看看《.NET CORE 数据库事务进化总结

因为框架需要,我没有使用后面那些工作单元、AOP 事务等方式,我选择利用线程id这种方式,这种方式也个很明显的缺点,就是不支持异步编程。

具体代码

在BLL层新增一个事务的方法
SystemUserBLL.cs

        /// <summary>
        /// 更新用户(事务)
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public DXResult Update(SystemUser item)
        {
            DXResult dXResult = new DXResult();

            try
            {
                //注意:Transaction不支持异步编程
                _dal.fsql.Transaction(() =>
                {
                    item.ModifyTime = DateTime.Now;
                    //更新用户表
                    dXResult.count = _dal.fsql.Update<SystemUser>().SetSource(item)
                        .IgnoreColumns(it => new { it.CreateTime })
                        .ExecuteAffrows();
                    //更新其他关联表
                    _dal.fsql.Ado.ExecuteNonQuery(string.Format("UPDATE TEST_USER SET ModifyTime=sysdate WHERE USERID='{0}'", item.Id));//这个表是没有创建的,用于异常跳出

                    if (dXResult.count < 1)
                        throw new Exception("数据修改失败");
                    dXResult.code = DXCode.Success;
                    dXResult.msg = "数据已修改";
                });
            }
            catch (Exception ex)
            {
                dXResult.code = DXCode.Failure;
                dXResult.msg = ex.Message;
            }

            return dXResult;
        }

接口
ISystemUserBLL.cs

DXResult Update(SystemUser item);

UI层

        [HttpPost("updateUser")]
        public dynamic UpdateUser(SystemUser user)
        {
            var obj = _systemUserBLL.Update(user);
            return obj;
        }

开始测试

数据库现有两条数据
在这里插入图片描述

1、先注释掉这段代码,然后测试

                    //更新其他关联表
                    //_dal.fsql.Ado.ExecuteNonQuery(string.Format("UPDATE TEST_USER SET ModifyTime=sysdate WHERE USERID='{0}'", item.Id));//这个表是没有创建的,用于异常跳出

在这里插入图片描述
成功更新数据
在这里插入图片描述
2、测试异常情况

在这里插入图片描述
在这里插入图片描述
数据没有变化,是期望的效果,成功。

完整代码已上传码云:https://gitee.com/shao-jiayong/cuo-ding

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello,Mr.S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值