2015-08-13 9 views
1

У меня есть приложение ASP.NET, где я использую порядковый номер из последовательности базы данных при создании записи в таблице с каркасом сущности. У меня есть хранимая процедура, которая извлекает следующее значение в этой последовательности, которое вызывается из фреймворка сущности, и я хочу, чтобы этот поиск был потокобезопасным.Получить номер последовательности номеров безопасно

Я использовал this ответ на попытку этого в следующем классе:

public static class SequenceNumber 
{ 
    private static object Lock = new object(); 

    public static long Next(Context db) 
    { 
     long next = 0; 

     lock (Lock) 
     { 
      next = db.GetNextComplaintNumber().Single().Value; 
     } 

     return next; 
    } 
} 

Будет ли это обеспечить безопасность потоков?

+0

Для чего? для области «GetNextComplaintNumber» да, но любой поток, вызывающий «Следующий», будет перемешаться с другими потоками. Если вы хотите, чтобы «GetNextComplaintNumber» вызывается только один раз, вы должны вместо этого полагаться на обработку транзакций базы данных. –

+0

Последовательность базы данных должна всегда указывать уникальный номер, поэтому называть его не должно быть проблем, вызвав его из нескольких потоков, что вы думаете, может пойти не так? – Mant101

+0

@ Manr101: Мне нужно, чтобы все числа были увеличены на 1 точно и с одним числом, которое никогда не пропускается. – Carel

ответ

1

Метод Next (...) будет потоковым, но db.GetNextComplaintNumber() не будет (если он не реализован). Блокировка гарантирует, что любой поток, вызывающий Next (...), должен будет ждать своей очереди, чтобы запустить все, что находится в инструкции блокировки. Однако, если любые другие потоки имеют доступ к объекту db, тогда они могут эффективно вызывать db.GetNextComplaintNumber(), не вызывая метод Next (...), поэтому он не будет защищен оператором блокировки. Если вы можете гарантировать, что db.GetNextComplaintNumber() вызывается только в методе Next (...), тогда вы должны быть в безопасности, иначе вы захотите реализовать безопасность потоков в методе db.GetNextComplaintNumber().

+0

Хорошо, это сработает. Идея этого класса заключается в том, что он является единственной точкой, к которой обращается GetNextComplaintNumber() в контексте EF. благодаря – Carel

Смежные вопросы