首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回滚如果为空

问回滚如果为空
EN

Stack Overflow用户
提问于 2016-04-26 08:10:30
回答 3查看 1.8K关注 0票数 0

我读过关于回滚事务的文章,但找不到我需要的东西。假设我有一个用户表。用户可以更新他/她的记录,但是如果输入的值为null,我希望回滚。我知道有很多简单的方法可以做到这一点,比如使用c#检查它是否为null等等,但是这里要指出的是理解回滚。如何使用带if(null)代码的回滚?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-26 08:22:20

Rollback与事务一起使用,rollback将状态还原到执行begin时的状态。

代码语言:javascript
复制
BEGIN TRAN 'tran1'
       INSERT INTO Whatever table...
      IF(... check for null)
      BEGIN 
        ROLLBACK TRAN 'tran1'
        RETURN 0
      END
COMMIT TRAN 'tran1'
票数 3
EN

Stack Overflow用户

发布于 2016-04-26 08:21:05

有三种方法。首先,如果您的检查仅在一列上,则在列定义上使用check约束:

代码语言:javascript
复制
 create table test (
      age int check (age > 40),
      ...  
 );

在更复杂的约束之前,您将需要triggers。可用触发器的类型取决于技术(oracle、sql服务器、mysql)。在“前插入”或“更新之前”触发器中,您可以生成一个异常,该异常将自动结束事务(相当于回滚)。下面是一个mysql示例:

代码语言:javascript
复制
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
//

最后,您可以启动事务,进行更改,然后决定是否要提交或回滚。

票数 2
EN

Stack Overflow用户

发布于 2016-04-26 08:37:24

若要回滚事务,必须首先启动事务。作为一种规则,DBMS有隐式事务,如果没有指定,那么每个语句或批处理都会启动并提交/回滚它自己的事务。或者您可以显式定义事务边界。

因此,如果需要任何(隐式、显式)事务,其中涉及将给定列设置为NULL,使其失败并回滚,则只需对该列定义约束即可。

或者,您可能只想要一些显式事务回滚,这取决于这个列值和一些其他条件。因此,您应该在代码中显式地进行此检查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36859004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档