Функция JetGetLock
Применимо к: Windows | Windows Server
Функция JetGetLock
Функция JetGetLock предоставляет средства для явного резервирования возможности обновления строки, записи блокировки или явного предотвращения обновления строки любым другим сеансом, блокировки чтения. Как правило, блокировки записи строк получаются неявно в результате обновления строк. Блокировки чтения обычно не требуются из-за управления версиями записей. Однако в некоторых случаях транзакции может потребоваться явно заблокировать строку для принудительной сериализации или обеспечить успешное выполнение последующей операции в силу того, что необходимые блокировки уже были приняты.
JET_ERR JET_API JetGetLock(
__in JET_SESID sesid,
__in JET_TABLEID tableid,
__in JET_GRBIT grbit
);
Параметры
sesid
Сеанс, который будет использоваться для этого вызова.
tableid
Курсор, который будет использоваться для этого вызова.
grbit
Группа битов, содержащая параметры, которые будут использоваться для этого вызова, которые включают ноль или более следующих элементов:
Значение |
Значение |
---|---|
JET_bitReadLock |
Этот флаг приводит к получению блокировки чтения для текущей записи. Блокировки чтения несовместимы с блокировками записи, уже удерживаемыми другими сеансами, но совместимы с блокировками чтения, удерживаемыми другими сеансами. |
JET_bitWriteLock |
Этот флаг приводит к получению блокировки записи для текущей записи. Блокировки записи несовместимы с блокировками записи или чтения, удерживаемыми другими сеансами, но совместимы с блокировками чтения, удерживаемыми в том же сеансе. |
Возвращаемое значение
Эта функция возвращает тип данных JET_ERR с одним из следующих кодов возврата. Дополнительные сведения о возможных ошибках ESE см. в разделах Ошибки подсистемы расширяемого хранилища и Параметры обработки ошибок.
Код возврата |
Описание |
---|---|
JET_errSuccess |
Операция выполнена успешно. |
JET_errClientRequestToStopJetService |
Невозможно выполнить операцию, так как все действия экземпляра, связанного с сеансом, прекратились в результате вызова JetStopService. |
JET_errInstanceUnavailable |
Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, столкнулся с неустранимой ошибкой, требующей отмены доступа ко всем данным для защиты целостности этих данных. Эта ошибка будет возвращена только в Windows XP и более поздних выпусках. |
JET_errInvalidgrbit |
Данный гбит не является ни JET_bitReadLock, ни JET_bitWriteLock. Это должен быть один из этих двух флагов. |
JET_errNoCurrentRecord |
Чтобы получить блокировку, курсор должен находиться на записи. Блокировки всегда находятся на записях. |
JET_errNotInitialized |
Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, еще не инициализирован. |
JET_errNotInTransaction |
Блокировки могут быть получены только сеансами в транзакции. |
JET_errPermissionDenied |
Курсор не может быть только для чтения и получить блокировку записи. |
JET_errRestoreInProgress |
Невозможно выполнить операцию, так как операция восстановления выполняется в экземпляре, связанном с сеансом. |
JET_errSessionSharingViolation |
Один и тот же сеанс нельзя использовать одновременно для нескольких потоков. Эта ошибка будет возвращена только в Windows XP и более поздних выпусках. |
JET_errTermInProgress |
Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, завершает работу. |
JET_errTransReadOnly |
Сеанс должен иметь разрешения на запись, чтобы получить блокировку записи. |
JET_errWriteConflict |
Ошибка, возвращаемая при запросе конфликтующей блокировки. |
При успешном выполнении сеанс получил запрошенную блокировку.
При сбое сеанс не получил запрошенную блокировку.
Комментарии
Блокировки записи невозможно получить с помощью сеансов или курсоров, имеющих разрешения только для чтения, даже если сеанс и курсор в конечном итоге не выполняют операцию обновления. Чтобы получить блокировку записи, сеанс и курсор должны иметь права на запись.
Блокировки чтения и записи являются средством пессимистичной блокировки. Пессимистичная блокировка предполагает, что несколько параллельных сеансов будут конфликтовать и получать блокировки заранее, чтобы обеспечить успешное выполнение операций.
Большинство операций будут сериализуемыми из-за неявных блокировок. Однако некоторые операции не будут. Чтобы проиллюстрировать это, рассмотрим две транзакции:
T1: R(A), U(B)
T2: R(B), U(A)
Управление версиями на уровне записей гарантирует, что каждая транзакция при параллельном выполнении будет видеть исходные значения для A и B. Нет последовательного порядка выполнения, который мог бы дать одинаковые результаты для A и B в случае, если результаты зависят от считываемых данных. Чтобы приложение удостоилось сериализуемой транзакции, оно должно получить явную блокировку чтения для A и B в каждой транзакции при считываемом значении.
Требования
Требование | Значение |
---|---|
Клиент |
Требуется Windows Vista, Windows XP или Windows 2000 Профессиональная. |
Сервер |
Требуется Windows Server 2008, Windows Server 2003 или Windows 2000 Server. |
Верхняя часть |
Объявлено в Esent.h. |
Библиотека |
Используйте ESENT.lib. |
DLL |
Требуется ESENT.dll. |
См. также:
JET_ERR
JET_SESID
JET_TABLEID
JetPrepareUpdate
JetStopService
JetUpdate