在采访中我遇到了一个问题。所以我尝试重新创建它:
工资
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)
答案 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