许多示例都主张显式回滚数据库事务,大致如下:

using (var transaction = ...)
{
    try
    {
        // do some reading and/or writing here

        transaction.Commit();
    }
    catch (SqlException ex)
    {
        // explicit rollback
        transaction.Rollback();
    }
}

但是,我倾向于这样做:

using (var transaction = ...)
{
    // do some reading and/or writing here

    transaction.Commit();
}

当异常发生时,我只是依赖于未提交的事务的隐式回滚.

依赖这种隐含的行为有什么问题吗?有没有人有令人信服的理由让我不能这样做?

推荐答案

不,这不是特别需要的,但是我可以想出两个理由,为什么这可能是一个好主意:

  • 清晰度

有些人可能会争辩说,使用transaction.Rollback()可以更清楚地表明,在什么情况下不会提交交易.

  • 正在释放锁

在处理事务时,必须意识到只有在回滚或提交事务时才会释放某些锁.如果您使用的是using语句,那么在处理事务时事务将被回滚,但是如果出于某种原因需要在using块内部执行一些错误处理,那么在执行复杂/耗时的错误处理之前回滚事务(移除锁)可能是有利的.

Database相关问答推荐

如果我想支持我的工作负载,我需要多少个 node ?

在 PostgreSQL 的数组列中查找字符串

数据库模式 - location

在 postgresql 中将列从字符串更改为字符串数组

区分大小写的数据库有什么好处吗?

通过删除执行计划中的排序运算符来优化 SQL 查询

在表上插入或更新违反外键约束

在 phpmyadmin 中导入时如何跳过重复记录

C# 连接到数据库并列出数据库

我可以在没有数据源的情况下配置 Grails 吗?

如何使用 SQL 命令文件创建 SQLite3 数据库文件?

每个 Docker 容器一个或多个数据库

在默认路径下使用脚本创建数据库?

多语言数据库,默认回退

触发器、断言和判断之间有什么区别?

在 Rails 中销毁/删除数据库

Slick 3.0 在数据库驱动程序级别是reactive/asynchronous的吗?对于哪些数据库?

我可以用 JPA 命名我的约束吗?

Django:将博客条目查看次数加一,这有效率吗?

C# IEnumerator/yield struct 可能不好?