当前位置:  开发笔记 > 后端 > 正文

我应该提交还是回滚读取事务?

如何解决《我应该提交还是回滚读取事务?》经验,为你挑选了3个好方法。

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

提交交易

回滚事务

什么也不做(这将导致事务在使用块结束时回滚)

做每一个有什么含义?

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?
    }
}

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



1> Mark Bracket..:

你提交.期.没有其他合理的选择.如果您开始了交易,则应该关闭它.提交释放您可能拥有的任何锁,并且对ReadUncommitted或Serializable隔离级别同样敏感.依赖隐式回滚 - 虽然技术上可能等同 - 只是糟糕的形式.

如果这还没有说服你,那么想象下一个在代码中间插入更新语句的人,并且必须追踪发生的隐式回滚并删除他的数据.


有一个明智的选择 - 回滚.显式回滚,即.如果您不想改变任何内容,则回滚可确保撤消任何操作.当然,不应该有任何改变; rollback保证.
假设我创建了一个临时表,用ids填充它,用数据表连接它以选择与ids一起使用的数据,然后删除临时表.我真的只是在读数据,我不关心临时表会发生什么,因为它是临时的......但从性能的角度来看,回滚事务或提交它会更昂贵吗?除了临时表和读操作之外什么都没有提交/回滚的效果?
@Triynko - 直觉上,我猜ROLLBACK更贵.COMMIT是正常用例,ROLLBACK是例外情况.但是,除了学术上,谁在乎呢?我相信你的应用程序有1000个更好的优化点.如果您真的很好奇,可以在http://bazaar.launchpad.net/~mysql/mysql-server/mysql-6.0/annotate/head:/sql/transaction.cc找到mySQL事务处理代码.
@Triynko - 优化的*唯一方法是分析.这是一个如此简单的代码更改,如果你真的想要优化它,没有理由不分析这两种方法.请务必向我们提供结果!
不同的DBMS可以具有不同的"隐式事务完成"语义.IBM Informix(我相信DB2)做隐式回滚; 通过谣言,Oracle做了一个隐含的提交.我更喜欢隐式回滚.

2> Graeme Perro..:

如果您没有更改任何内容,则可以使用COMMIT或ROLLBACK.任何一个都会释放你已经获得的任何读锁定,并且由于你没有做任何其他更改,它们将是等效的.



3> Neil Barnwel..:

如果您开始交易,那么最佳做法始终是提交.如果在您的use(事务)块中抛出异常,则事务将自动回滚.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有