我正在阅读有关回滚交易的文章,无法找到我需要的内容。假设我有一个用户表。用户可以更新他/她的记录,但如果输入的值为null,我想要回滚。我知道有很多简单的方法可以做到这一点,比如使用c#检查它是否为null,这样的事情,但指向这里是理解回滚。如何使用if(null)代码回滚?
答案 0 :(得分:2)
有三种方法。首先,如果您的检查仅在一列上,请对列定义使用check
约束:
create table test (
age int check (age > 40),
...
);
对于更复杂的约束,您需要triggers
。可用的触发器类型取决于技术(oracle,sql server,mysql)。在插入之前的或更新之前的触发器内部,您可以生成异常,该异常将自动结束事务(相当于回滚)。这是一个mysql示例:
delimiter //
drop trigger if exists trg_trigger_test_ins //
create trigger trg_trigger_test_ins before insert on test
for each row
begin
declare msg varchar(128);
if new.age <= 40 then
set msg = concat('MyTriggerError: age incorrect : ', cast(new.id as char));
signal sqlstate '45000' set message_text = msg;
end if;
end
//
最后,您可以启动事务,进行更改,然后决定是否要提交或回滚。
答案 1 :(得分:2)
回滚与事务一起使用,回滚将状态恢复为执行begin tran时的状态。
BEGIN TRAN 'tran1'
INSERT INTO Whatever table...
IF(... check for null)
BEGIN
ROLLBACK TRAN 'tran1'
RETURN 0
END
COMMIT TRAN 'tran1'
答案 2 :(得分:0)
要回滚交易,您必须先启动交易。作为规则,DBMS具有隐式事务,如果没有指定,则每个语句或批处理启动并提交/回滚它自己的事务。或者您可以显式定义事务边界。
因此,如果您需要任何(隐式,显式)事务,该事务涉及将给定列设置为NULL以使其失败并回滚,则只需在此列上定义约束。
或者,您可能只需要一些显式事务回滚,具体取决于此列值和其他一些条件。因此,您应该在代码中明确检查。