2016-04-26 50 views
0

我正在閱讀有關回滾事務的文章,找不到像我需要的內容。假設我有一個用戶表。用戶可以更新他/她的記錄,但如果輸入值爲空,我想要回滾。我知道有很多簡單的方法可以做到這一點,比如使用c#進行檢查,如果它是空的,那麼這裏指的是理解回滾。如何在if(null)代碼中使用回滾?回滾如果爲空

+0

爲什麼不簡單地NOT NULL列? – jarlh

+0

就像我說的那樣做有很多方法,而不是null是其中之一,但我需要一個回滾的例子與if。它可以是'如果年齡<40然後回滾'。檢查null只是一個示例@jarlh –

+0

請標明您正在使用的語言和您嘗試使用的任何代碼。 –

回答

2

回滾與事務一起使用,回滾將狀態恢復到執行開始tran時的狀態。

BEGIN TRAN 'tran1' 
     INSERT INTO Whatever table... 
     IF(... check for null) 
     BEGIN 
     ROLLBACK TRAN 'tran1' 
     RETURN 0 
     END 
COMMIT TRAN 'tran1' 
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 
// 

最後,你就可以開始交易,進行更改,然後決定是否要提交回滾

0

要回滾事務,您必須先啓動事務。通常,DBMS具有隱式事務,如果沒有指定,每個語句或批處理都會啓動並提交/回滾它自己的事務。或者你可以明確定義事務邊界。

因此,如果您需要任何涉及將給定列設置爲NULL以便失敗並回滾的任何(隱式顯式)事務,那麼只需在此列上定義約束。

或者,您可能只想要一些顯式事務回滾,具體取決於此列值和其他一些條件。所以你應該明確地在你的代碼中進行檢查。