RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.

SQLite C Interface

Зарегистрируйте отзыв, чтобы обработать ошибки SQLITE_BUSY

int sqlite3_busy_handler(sqlite3*,int(*)(void*,int),void*);

sqlite3_busy_handler(D,X,P) устанавливает функцию обратного вызова X, который мог бы быть вызван с аргументом P каждый раз, когда предпринята попытка получить доступ к таблице базы данных, связанной с соединением с базой данных D, когда другой поток или процесс заблокировал таблицу. sqlite3_busy_handler() используется, чтобы осуществить sqlite3_busy_timeout() и PRAGMA busy_timeout.

Если занятый отзыв NULL, то SQLITE_BUSY возвращен непосредственно после столкновения с блокировкой. Если занятый отзыв не NULL, то отзыв мог бы быть вызван с двумя аргументами.

Первый аргумент занятому обработчику это копия указателя void*, который является третьим аргументом sqlite3_busy_handler(). Второй аргумент занятому отзыву обработчика это число раз, которое обработчик был вызван ранее для того же самого события. Если занятый отзыв возвращает 0, то никакие дополнительные попытки не предприняты, чтобы получить доступ к базе данных, и SQLITE_BUSY возвращен приложению. Если отзыв вернет значение, отличное от нуля, то другая попытка предпринята, чтобы получить доступ к базе данных и повторениям цикла.

Присутствие занятого обработчика не гарантирует, что он будет вызван, когда будет конкуренция за блокировку. Если SQLite решит, что вызов занятого обработчика мог привести к мертвой блокировке, это будет идти вперед и возвращать SQLITE_BUSY приложению вместо того, чтобы вызвать обработчик. Рассмотрите сценарий, где один процесс держит блокировку чтения, который он пытается продвинуть зарезервированную блокировку, а второй процесс держит зарезервированную блокировку, которой он пытается способствовать монопольной блокировке. Первый процесс не может продолжиться, потому что он заблокирован вторым, второй процесс не может продолжиться, потому что он заблокирован первым. Если оба процесса вызовут занятых обработчиков, ни один не сделает ничего. Поэтому SQLite возвращает SQLITE_BUSY для первого процесса, надеясь, что это побудит первый процесс снять блокировку чтения и позволить второму процессу продолжаться.

По умолчанию отзыв является NULL.

Может только быть единственный обработчик, определенный для каждого соединения с базой данных. Урегулирование нового занятого обработчика очищает любой заданный ранее обработчик. Обратите внимание на то, что, вызов sqlite3_busy_timeout() или PRAGMA busy_timeout=N изменит занятого обработчика и таким образом очистит заданный ранее.

Занятый отзыв не должен принимать меры, которые изменяют соединение с базой данных, которое вызвало занятого обработчика. Любые такие действия приводят к неопределенному поведению.

Занятой обработчик не должен закрывать соединение с базой данных или подготовленный запрос, который вызвал занятого обработчика.