SQL 2005 sp_GetAppLock — Когда назвать sp_ReleaseAppLock?

Вы находитесь на неправильном конце Межтрубы. Это - сервер, который может иметь только один конкретный открытый порт. Некоторый код:

  IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
  try {
    TcpListener tcpListener = new TcpListener(ipAddress, 666);
    tcpListener.Start();
  }
  catch (SocketException ex) {
    MessageBox.Show(ex.Message, "kaboom");
  }

Сбои с:

Только одно использование каждого адреса сокета (адрес/порт протокола/сети) обычно разрешается.

5
задан gbn 8 September 2009 в 19:51
поделиться

2 ответа

From sp_getapplock

Блокировки, связанные с текущим транзакция выпущена, когда транзакция фиксируется или откатывается.

Итак, это не нужно, потому что вы откатываетесь.

Однако, если вы хотите быть в безопасности, я сделаю это после блока CATCH и сначала протестирую с помощью APPLOCK_TEST . Обычно это будет блок НАКОНЕЦ, которого у нас нет.

Я бы поставил его здесь, чтобы он всегда выполнялся. Если сеанс продолжается или пул соединений поддерживает его в рабочем состоянии (неужели? Забудьте прямо сейчас), тогда вы полагаетесь на COMMIT / ROLLBACK, если это было не непосредственно перед выходом. Конечно, все, что пропускает блок CATCH, в любом случае будет серьезной ошибкой прерывания ...

6
ответ дан 14 December 2019 в 08:56
поделиться

Если вы откатываете транзакцию, нет необходимости снимать блокировку приложения в вашем захвате.

Из http://msdn.microsoft.com/en-us /library/ms189823.aspx:

Блокировки, размещенные на ресурсе, связаны либо с текущим транзакция или текущий сеанс. Блокировки, связанные с текущей транзакцией, снимаются, когда транзакция фиксируется или откатывается. Блокировки, связанные с сеансом: освобождается, когда сеанс регистрируется вне. Когда сервер выключается на по любой причине все блокировки снимаются.

1
ответ дан 14 December 2019 в 08:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: