我有一个在事务中执行的读取查询,以便指定隔离级别.一旦查询完成,我该怎么办?

  • 提交事务
  • 回滚事务
  • 不执行任何操作(这将导致事务在使用块结束时回滚)

每种方法的含义是什么?

using (IDbConnection connection = ConnectionFactory.CreateConnection())
{
    using (IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted))
    {
        using (IDbCommand command = connection.CreateCommand())
        {
            command.Transaction = transaction;
            command.CommandText = "SELECT * FROM SomeTable";
            using (IDataReader reader = command.ExecuteReader())
            {
                // Read the results
            }
        }

        // To commit, or not to commit?
    }
}

编辑:问题不在于是否应该使用事务,或者是否有其他方法来设置事务级别.问题是,提交或回滚一个不修改任何内容的事务是否有任何区别.有性能差异吗?它会影响其他连接吗?还有其他区别吗?

推荐答案

你promise .时期没有其他明智的 Select .如果你启动了一项交易,你应该关闭它.提交将释放您可能拥有的所有锁,并且对于ReadUncommitted或Serializable隔离级别同样合理.依赖隐式回滚(虽然在技术上可能是等效的)只是一种糟糕的形式.

如果这还不能说服你,想象下一个在你的代码中间插入UPDATE语句的人,并且必须跟踪发生的隐式回滚并删除他的数据.

Sql相关问答推荐

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

Postgres trunc_date删除一个月

在多个柱上连接时,如何确定连接条件?

解析SQL Server中的嵌套JSON

两个不同星期的销售额,不加成一行

用户购买平台及金额统计

PATINDEX中与[A-Z]匹配(U除外)的正则表达式

SQL查询正在工作,但返回空结果

每个分组最多 Select 最后 2 个值并并排显示它们

使用 Oracle SQL Developer 将不同的列值转换为列会导致错误 ORA-01489

DB2 SQL查询结果多余数据

将时间戳四舍五入到最近 10 分钟的查询

返回给定日期后的第 4 个工作日(不包括公众假期)

如何 for each id创建长度等于id长度的不同日期序列?

验证某个日期前后的连续代码

SQL ORACLE - 查找连续天数

如何在 ClickHouse SQL 中使用 CTE 将邻居语句中的数字作为偏移量传递?

多列上的 SQL UNIQUE 约束 - 它们的组合必须是唯一的还是至少其中之一?

SQL中所有先前日期的累计总和

两个相似的 presto SQL 查询之间的差异