代码之家  ›  专栏  ›  技术社区  ›  Pugal

在trans和rollback之间存储数据的位置…?

  •  1
  • Pugal  · 技术社区  · 7 年前

    在面试中我遇到了一个问题。所以我试着重新创造它:

    薪水

    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
    

    我的问题是,

    旧的工资价值存储在哪里。?

    注:我猜是 Magic Table 可以用作触发器。

    当我在谷歌上搜索“trans和rollback之间的数据存储在哪里”时,我得到的结果是不同类型的数据 事务回滚教程 .所以我需要堆栈溢出的帮助。

    编辑1

    begin tran
    update salary set Salary = 25000 where id = 2
    select * from salary -- salary = 25000
    -- I want to see salary = 40000 at here. Where as OUTPUT clause is invalid.
    rollback
    select * from salary -- salary = 40000
    

    谢谢

    泰米尔普加尔。

    2 回复  |  直到 7 年前
        1
  •  6
  •   Sean Lange    7 年前

    这不是一张“神奇的桌子”。事务详细信息存储在事务日志中,直到事务被释放(提交或回滚)。一个表在这里是不够的,因为一个事务可以影响任意数量的表。

    更清楚地说,数据仍然驻留在表中,但被标记为删除。然后,要么这些行被取消标记,要么这些行被删除。我不擅长解释这一点,但这是它工作原理的基本概念。

        2
  •  2
  •   Jason A. Long    7 年前

    看看这个。。。

    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