在trans和rollback之间存储了什么数据?

时间:2018-11-16 19:12:18

标签: sql-server transactions rollback

在采访中我遇到了一个问题。所以我尝试重新创建它:

工资

def base_parameters
  [:a, :b, :c, :d]
end

def others
  [:e, :f]
end

def create_parameters
  params.require(:order)
        .permit(*base_parameters.concat(others))
end

请参见以下示例:

id  Emp_id  Salary
1   1       50000
2   2       40000
3   3       30000

我的问题是,

  

工资的旧值存储在哪里?

注意:我的猜测是begin tran update salary set Salary = 25000 where id = 2 select * from salary -- salary = 25000 rollback select * from salary -- salary = 40000 可用作触发器。

当我用谷歌搜索“数据在反转换和回滚之间的存储位置”时,我得到的结果是不同类型的 Transaction-Rollback教程。所以我需要堆栈溢出的帮助。

编辑1

Magic Table

谢谢

泰米尔语(TamilPugal)

2 个答案:

答案 0 :(得分:6)

这不是“魔术桌”。事务详细信息存储在事务日志中,直到释放事务(提交或回滚)为止。由于事务可能会影响任何数量的表,因此这里的表是不够的。

更清楚地说,数据仍然驻留在表中,但被标记为删除。然后,这些行将变为未标记或被删除。我不善于解释这一点,但这是其工作原理的基本概念。

答案 1 :(得分:2)

看看这个...

USE tempdb;
go

CREATE TABLE dbo.TranTest (id INT NOT NULL, some_value INT NOT NULL);
INSERT dbo.TranTest (id, some_value) VALUES (1, 11111);

BEGIN TRANSACTION
    -- check initial values...
    SELECT * FROM dbo.TranTest tt;

    -- update values and include the OUTPUT clause to view the contents of the "Inserted" & "Deleted" tables.
    UPDATE tt SET 
        tt.some_value = tt.some_value * 22
            OUTPUT 
                Deleted.id, 
                Deleted.some_value, 
                Inserted.id, 
                Inserted.some_value, 
                GETDATE() AS tran_date 
    FROM
        dbo.TranTest tt;

    -- check the values after the UPDATE and before the ROLLBACK
    SELECT * FROM dbo.TranTest tt;

ROLLBACK TRANSACTION

    -- check the values after the ROLLBACK
    SELECT * FROM dbo.TranTest tt;  

结果...

id          some_value
----------- -----------
1           11111

id          some_value  id          some_value  tran_date
----------- ----------- ----------- ----------- -----------------------
1           11111       1           244442      2018-11-16 16:18:17.330

id          some_value
----------- -----------
1           244442

id          some_value
----------- -----------
1           11111