RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 786863
Accepted
Kunoichi
Kunoichi
Asked:2020-02-18 23:30:49 +0000 UTC2020-02-18 23:30:49 +0000 UTC 2020-02-18 23:30:49 +0000 UTC

什么更便宜:捕获异常或向数据库发送请求?

  • 772

有一个向数据库添加信息的功能。该函数可以向数据库发送请求,以初步检查是否可以添加实体,或者只是捕获异常。

第一个选项(检查数据库中是否有这样的用户名,不要捕获异常):

    public virtual async Task<ServiceResult> CreateAsync(User user)
    {
        var errors = Validation(user);
        if (errors.Count > 0)
        {
            return new ServiceResult(false, errors);
        }

        if (await Queryable.AnyAsync(u => u.UserName == user.UserName))
        {
            return new ServiceResult(false, "This username already exists.");
        }

        try
        {
            await DbContext.AddAsync(user);
            await DbContext.SaveChangesAsync();
        }
        catch (Exception ex)
        {
            return new ServiceResult(false, ex.Message);
        }

        return new ServiceResult(true);
    }

第二个选项(我们不检查数据库中是否有这样的用户名,我们捕获异常):

    public virtual async Task<ServiceResult> CreateAsync(User user)
    {
        var errors = Validation(user);
        if (errors.Count > 0)
        {
            return new ServiceResult(false, errors);
        }

        try
        {
            await DbContext.AddAsync(user);
            await DbContext.SaveChangesAsync();
        }
        catch (Exception ex)
        {
            return new ServiceResult(false, ex.Message);
        }

        return new ServiceResult(true);
    }

什么是最好的方法?

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    rdorn
    2020-11-17T08:28:41Z2020-11-17T08:28:41Z
    1. 必须始终处理使用数据库时的异常,因为。异常的原因不仅可能是您尝试添加的条目的存在,还可能是许多其他因素,例如通信通道中断、长时间阻塞和超时等。等等 此外,在检查记录是否存在和插入记录之间有足够的时间,以便在这些事件之间另一个客户端有时间执行其插入,即使没有其他外部因素,您也会得到相同的异常。

    2. 在 SQL 中,您可以使用安全的插入语句MERGE代替INSERT. EF 还提供了AddOrUpdate方法形式的安全添加机制,但是我没有看它内部是如何工作的,而且它没有 MERGE 灵活,因为 只实现了使用 MERGE 的一种可能性。例如,使用 MERGE,如果记录已经存在,我什么也做不了。

    • 2
  2. V0d01ey
    2020-07-06T22:05:54Z2020-07-06T22:05:54Z
    1. 如果对 DBMS 的访问组织得当,那么连续的数据库查询将在与 DBMS 的同一连接中执行,这会导致快速响应。相比之下,抛出和处理异常是昂贵的操作,涉及调用堆栈的棘手工作。因此,您需要在验证的帮助下将异常发生的可能性降到最低。
    2. 输入验证是业务逻辑的正常部分。你通常需要一个很好的理由来拒绝验证。另一方面,异常不应成为业务逻辑的一部分,它们通常会报告很少发生的系统故障。
    3. 当多个用户的操作在表行级别重叠时,验证在极少数情况下无济于事。为了解决这些问题,有一种交易机制。在这里,不能不处理事务完成异常。这就是为什么他是个例外。

    您还可以阅读有关异常的更详细答案: https ://ru.stackoverflow.com/a/140607/242690

    • -2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5