|
|
|
На время реорганизации дерева тотальное блокирование таблицы?
|
|||
|---|---|---|---|
|
#18+
Продолжая ранее начатую тему. ...Решаю задачу, когда пользователь захочет реорганизовать дерево (у меня дерево основано на таблице вложенных множеств). Так вот, несомненно, эта операция будет редко запускаться юзерами (ну не каждый же раз революции на предприятии!) Процесс затрагивает обновления полей lft, rgt всех записей, поэтому на это время необходима, полагаю, тотальная блокировка таблицы - чтобы никто другой не мог ни читать, ни тем более обновлять эту же таблицу. Т.е. в начале транзакции перестроения указываю: SELECT .... FROM ... WITH (TABLOCKX) WHERE ... И хинт TABLOCKX будет удерживать блокировку до конца всей транзакции. Вопрос в том, что будет, если в период транзакции выключится компьютер юзера, инициировавщего эту транзакцию, или ещё какие подобные гадости произойдут. Таблица так и останется заблокированной???? (Переделывать иерархическую систему нет возможности - правила игры определены уже ранее и не мной) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2002, 05:58:25 |
|
||
|
На время реорганизации дерева тотальное блокирование таблицы?
|
|||
|---|---|---|---|
|
#18+
Это хороший вопрос. Ответ будет состоять из двух частей. Первая - общеизвестна: при убиении соединения SQL Server освобождает все наложенные им блокировки. Это легко проиллюстрировать. Откройте два коннекта. Сделайте на первом begin tran select * from orders (tablockx holdlock) на втором sp_lock: spid dbid ObjId IndId Type Resource Mode Status ------ ------ ----------- ------ ---- ---------------- -------- ------ 51 6 0 0 DB S GRANT 51 6 21575115 0 TAB X GRANT 53 1 85575343 0 TAB IS GRANT и еще раз kill 51 sp_lock: spid dbid ObjId IndId Type Resource Mode Status ------ ------ ----------- ------ ---- ---------------- -------- ------ 53 1 85575343 0 TAB IS GRANT Вторая часть менее тривиальна и состоит в том, как SQL Server понимает, что соединение сдохло. За это отвечают его сетевые библиотеки. Раньше все было просто: если таймаут кончился, а Ack не получен, клиент отключался нафиг за неуплату. Для TCP/IP время ожидания сидит, напр., в KeepAlive в HKLM\System\CurrentControlSet\Services\TcpIp\Parameters. Аналогично для ост.протоколов. После того, как в Windows 2000 появилась поддержка пресловутой IntelliSense, жизнь, с одной стороны, стала легче (напр., она мгновенно распознает выдергивание кабеля), с другой - процедура настройки какая-то лично для меня неочевидная. Вроде, кажется, все уже выставил - он все равно может случайным образом продержать его все выходные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2002, 11:15:12 |
|
||
|
|

start [/forum/topic.php?fid=46&gotonew=1&tid=1822574]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
195ms |
get topic data: |
12ms |
get first new msg: |
6ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 545ms |

| 0 / 0 |
