私の wcf サービスの信頼性をテストしようとしています。クライアント側からループ内で wcf サービスを呼び出しています。wcf rest サービス (webhttpbinding) は、いくつかのデータ処理を行い、レコードをデータベースに挿入します。操作全体がトランザクション内で行われます。
InstanceContextMode を PerCall に設定すると、約 60 のメッセージ (ループ内から呼び出されるサービスの 60 倍) のうち 40 のみがデータベースに送信されることがわかりました。エラーも例外もありません。メッセージはドロップされているだけです。
InstanceContextMode を Single に設定すると、すべてのメッセージがデータベースに送信されます。InstanceContextMode.Percall は不可逆であり、予想される動作ですか? また、並行性を設定していません。明確化は非常に役立ちます。コードを追加しました。MySQLをデータベースとして使用...
編集私の悪い-サーバー側で例外が発生することに気づきました-{「ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再起動してください」}
これは、トランザクションの進行中に、同じレコードに対して呼び出された別のトランザクションがあるためです。一度失敗した場合、トランザクションを再起動することで修正します。
サービス
[WebInvoke(UriTemplate = "employee", Method = "POST")]
public long AddNewEmployee(EmployeeEntity newEmployee)
{
EmployeeRepository eRep = new EmployeeRepository();
return eRep.AddNewEmployee(newEventEntity);
}
リポジトリ クラス コンストラクターは、オブジェクト コンテキストを初期化します。
public EmployeeRepository()
{
bd = new EmployeeEntity();
}
コード - サービス呼び出し
//bd is the object context
//there are two tables
internal long AddNewEmployee(EmployeeEntity newEmployee)
{
bool tSuccess = false;
using (TransactionScope transaction = new TransactionScope())
{
try
{
//get existing employees
var existingEmployees = from employee
in bd.employees select employee;
List<employee> returnedEmployees = new List<employee>();
//Do some processing
returnedEmployees = DoSomeprocessing(existingEmployees);
//Insert returned employees as updates
foreach (employee e in returnedEmployees)
{
bd.employees.AddObject(e);
}
bd.SaveChanges();
returnedEmployees.Clear();
//add to second table
bd.otherdetails.AddObject(newEmployee);
bd.SaveChanges();
//Transaction Complete
transaction.Complete();
tSuccess = true;
}
catch (Exception e)
{
//return something meaningful
return -1;
}
}
if (tSuccess)
{
//End Transaction
bd.AcceptAllChanges();
return 200;
}
else
{
return -1;
}
}
クライアント側はループでサービスを呼び出すだけです