次の問題を解決する必要があります。考えられる解決策として考えていることが正しいとは思わないため、助けが必要だと思います。
列を持つ SQL Server テーブルがありidentity
ます。このテーブルには、以下で説明するように、現在のデータと履歴データが格納されます。
次の表があるとします。
CREATE TABLE Patient (PatientKey int IDENTITY(1,1) NOT NULL, PatientId int, UpdateDate datetime NOT NULL, UpdateUser int NOT NULL, RecordStatus tinyint NOT NULL)
PatientKey
主キーであり、ID 列でもあります。PatientId
患者を一意に識別することです(現在の記録と過去の記録)。UpdateDate
患者が挿入または更新された日付です。UpdateUser
患者を挿入または更新したユーザーのキーです。RecordStatus
はレコードのステータスを示します: 0 - 履歴、1 - 現在、2 - 削除済み。
上のテーブル
PatientId + RecordStatus = 1
では、患者の現在のレコードを一意に識別します。新しい患者が挿入されると、新しい患者が
PatientKey
レコードに割り当てられ (これは SQL Server エンジンによって自動的に行われます) 、新しい患者PatientId
も計算されてレコードに割り当てられる必要があります。また、RecordStatus
は 1 に設定されます。既存の患者が更新されると、現在のレコードが更新され
RecordStatus
て 0 に設定されます。次に、患者の変更されたデータを含む新しい行が挿入されます。挿入の一部としてPatientKey
、レコードに対して new が生成されますが、newPatientId
は計算されません (つまり、PatientId
変更されません)。また、RecordStatus
は 1 に設定されます。患者が削除されると、現在のレコードが更新され
RecordStatus
て 2 に設定されます。
問題は の計算にありPatientId
ます。MAX(PatientId) + 1
新しいレコードに割り当てる新しいを取得するためにストアド プロシージャでa を使用することを考えていPatientId
ますが、これは同時実行性に問題があります。複数のユーザーが同時に新しい患者を作成している場合、SP は基本的PatientId
にそれらのうちの 2 人に対して同じものを計算し、テーブルに 2 人の異なる患者を同じPatientId
.
次に、SQL Server トランザクションに更新を入れてテーブルをブロックすることを考えていましたが、これでは多すぎると思います。その上、複雑な更新の場合、テーブルがブロックされすぎて、患者を作成する他の試みがタイムアウトになると思います。これを実装するより良い方法はありますか?
ありがとう。