我有一个读取查询,我在一个事务中执行,以便我可以指定隔离级别.查询完成后,我该怎么办?
提交交易
回滚事务
什么也不做(这将导致事务在使用块结束时回滚)
做每一个有什么含义?
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? } }
编辑:问题不在于是否应该使用交易或是否有其他方法来设置交易级别.问题是,是否提交或回滚了不修改任何内容的事务.有性能差异吗?它会影响其他连接吗?还有其他差异吗?
你提交.期.没有其他合理的选择.如果您开始了交易,则应该关闭它.提交释放您可能拥有的任何锁,并且对ReadUncommitted或Serializable隔离级别同样敏感.依赖隐式回滚 - 虽然技术上可能等同 - 只是糟糕的形式.
如果这还没有说服你,那么想象下一个在代码中间插入更新语句的人,并且必须追踪发生的隐式回滚并删除他的数据.
如果您没有更改任何内容,则可以使用COMMIT或ROLLBACK.任何一个都会释放你已经获得的任何读锁定,并且由于你没有做任何其他更改,它们将是等效的.
如果您开始交易,那么最佳做法始终是提交.如果在您的use(事务)块中抛出异常,则事务将自动回滚.