Попытка проверить надежность моих услуг wcf.Я вызываю службу wcf в цикле со стороны клиента.Служба отдыха wcf (webhttpbinding) выполняет некоторую обработку данных и вставляет записи в базу данных.Вся операция выполняется в рамках транзакции.
Я обнаружил, что из примерно 60 сообщений (в 60 раз больше, чем служба вызывается из цикла) только 40 проходят через базу данных, если я установил свой InstanceContextMode в PerCall.Там нет ошибок, нет исключений.Сообщения просто удаляются.
Если я установлю 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;
}
}
Клиентсторона просто вызывает услугу в цикле