我读过关于回滚事务的文章,但找不到我需要的东西。假设我有一个用户表。用户可以更新他/她的记录,但是如果输入的值为null,我希望回滚。我知道有很多简单的方法可以做到这一点,比如使用c#检查它是否为null等等,但是这里要指出的是理解回滚。如何使用带if(null)代码的回滚?
发布于 2016-04-26 08:22:20
Rollback与事务一起使用,rollback将状态还原到执行begin时的状态。
BEGIN TRAN 'tran1'
INSERT INTO Whatever table...
IF(... check for null)
BEGIN
ROLLBACK TRAN 'tran1'
RETURN 0
END
COMMIT TRAN 'tran1'发布于 2016-04-26 08:21:05
有三种方法。首先,如果您的检查仅在一列上,则在列定义上使用check约束:
create table test (
age int check (age > 40),
...
);在更复杂的约束之前,您将需要triggers。可用触发器的类型取决于技术(oracle、sql服务器、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
//最后,您可以启动事务,进行更改,然后决定是否要提交或回滚。
发布于 2016-04-26 08:37:24
若要回滚事务,必须首先启动事务。作为一种规则,DBMS有隐式事务,如果没有指定,那么每个语句或批处理都会启动并提交/回滚它自己的事务。或者您可以显式定义事务边界。
因此,如果需要任何(隐式、显式)事务,其中涉及将给定列设置为NULL,使其失败并回滚,则只需对该列定义约束即可。
或者,您可能只想要一些显式事务回滚,这取决于这个列值和一些其他条件。因此,您应该在代码中显式地进行此检查。
https://stackoverflow.com/questions/36859004
复制相似问题