2016-04-26 7 views
0

ロールバックトランザクションに関する記事を読んでいましたが、必要なものが見つかりませんでした。ユーザーテーブルがあるとします。ユーザーは自分のレコードを更新できますが、入力された値がnullの場合はロールバックします。 C#でチェックするような簡単な方法がたくさんあることはわかっています。もしそれがヌルで、そのようなものなら、ここでのポイントはロールバックを理解することです。 if(null)コードでロールバックを使用するにはどうすればよいですか?nullの場合ロールバック

+0

単にNOT NULL列ではないのはなぜですか? – jarlh

+0

私はこれを行う方法はたくさんあると言いましたが、nullではなく、その1つですが、ifでロールバックの例が必要です。 「年齢が40歳代の場合はロールバック」のようなものになる可能性があります。ヌルをチェックすることは単なる例にすぎません@jarlh –

+0

あなたが使っている言語とあなたが試みたコードにラベルを付けてください。 –

答えて

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

3つの方法があります。あなたのチェックが列定義の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に設定して失敗してロールバックすることを含む(暗黙的で明示的な)トランザクションが必要な場合は、この列に対して制約を定義するだけです。

また、この列の値やその他の条件によっては、明示的なトランザクションのロールバックが必要な場合もあります。だからあなたは明示的にあなたのコードでこのチェックをする必要があります。

関連する問題