仅使用SELECT命令回滚或提交事务

时间:2014-02-05 17:21:08

标签: sql sql-server tsql transactions

我想知道在它内部只有SELECT命令的情况下,使用ROLLBACK或COMMIT结束事务是否有所不同。 有这样的伪代码:

using (var tr = new TransactionScope())
{
    if (!GetData(condition).Any()) // SELECT command behind
    {
      InsertData();  // INSERT command

      tr.Commit();
      return true;
    }

    tr.Commit(); // Or rollback?
    return false;
}

在任何一种情况下是否都有性能处罚或无关紧要?

2 个答案:

答案 0 :(得分:0)

假设您的InsertData基于okut插入了GetData的输出:

一般清理

using (var tr = new TransactionScope())
{
    if (!GetData(condition).Any()) // SELECT command behind
    {
      InsertData();  // INSERT command
      tr.Complete()
      return true;
    }

    return false;
    // rollback will be automatic if complete isn't called
}

更高效:

if (!GetData(condition).Any()) // SELECT command behind
{
  // implied transaction within the InsertData method.
  InsertData();  // INSERT command
  return true;
}

return false;

答案 1 :(得分:0)

提交说“对我在此事务范围内所做的任何数据修改都是持久的”。 Rollback说“撤消我在此交易范围内所做的任何数据修改”。在select的情况下,没有进行任何数据修改,因此提交和回滚都做同样的事情(即释放选择完成后保存的任何锁)。