0

以前に、このストアド プロシージャを作成しました。

            Create Procedure CreateEmployee
            (
            @Role_ID Int,
            @FirstName Varchar(50),
            @LastName Varchar(50),
            @DateOfBirth Varchar(50),
            @Active Bit
            )
            As
            Begin

            If Not Exists (Select FirstName, LastName, DateOfBirth 
                From Employee Where FirstName = @FirstName
                AND LastName = @LastName
                AND DateOfBirth = @DateOfBirth)

                Begin
                Insert Into Employee (Role_ID, FirstName, LastName, DateOfBirth, Active)
                Values (@Role_ID, @FirstName, @LastName, @DateOfBirth, @Active)
                End

            Else
                Begin
                Select 'User already exists!'
                End

            End

この手順では、挿入を実行する前に、Employee テーブルに従業員がまだ存在していないことを確認します。

あらゆる種類のテーブル変更が発生する前に行われる単一の条件チェックであるという点で、十分な防弾のようです。ただし、トランザクションについていくつか読んだ後、保護層を追加するためにすべての手順をトランザクションにする必要があるかどうか疑問に思っています。

tl博士; トランザクションを使用してはいけない場合はありますか?

4

3 に答える 3

1

追加の保護層のために、すべての手順トランザクションを作成する必要があるかどうか疑問に思っています。

絶対違う!これを行うと、データベースがデッドロックする可能性がはるかに高くなり、関連するパフォーマンスの問題が発生します。

トランザクションを使用してはいけない場合はありますか?

各手順を個別に確認し、絶対に必要な場合にのみトランザクションを追加して、トランザクション ブロックができるだけ小さくなるようにします。また、各トランザクションのテーブル アクセス順序が同じであることを確認してください。これらのヒントは、デッドロックとパフォーマンスに役立ちます。

問題の場合、顧客が重複することを懸念している場合は、一意の制約を追加します。ここではトランザクションは必要ありません。

ところで、FirstName、LastName、および DateOfBirth は、顧客の実際のデータベースで一意性を判断するのには適していません。たとえば、生年月日が同じジョン・スミスが 2 人いる可能性は十分にあります。

于 2013-02-11T12:02:10.127 に答える
0

データベースは、マルチスレッド プログラムと同様に、データの読み取りと変更を同時に行うことができます。

この場合、あなた;

  1. 特定の行が存在しないことを確認する
  2. 行を挿入します

各ステートメントはアトミックですが、まったく同じ行の別の挿入を含め、他のステートメント/トランザクションは 1 と 2 の間で発生する可能性があります。

したがって、これを防ぐには、両方のステートメントの周りでトランザクションを使用して、1 つのアトミック アクションにする必要があります。

意味が論理的な破損である場合は、チェック/変更シーケンスを実行する場所でトランザクション ラッパーが必要になります。

于 2013-02-11T12:14:49.173 に答える