|
|
|
Блокировка & буферизация (конкретный пример)
|
|||
|---|---|---|---|
|
#18+
Есть в БД таблица: dt(дата) cnt(количество) При нажатии кнопки на форме необходимо увеличить cnt определенной даты строго на единицу. Приложение многопользовательское. Если я сделаю так, конфликтов наверное не будет...вроде как по досовской классике : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Ну вроде как в совремменом Visual программирование, я так понимаю, блокировки не приветствуются, так вот как мне б изменить код под "буферизацию"? -Я так понимаю надо использовать пессимистическую на уровне строк? -Тогда как сделать чтоб второй пользователь "ждал" пока первый изменит запись...как это происходит при буферизации? -И вообще надо ли это в моем случае?...может по старинке вернее будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2006, 11:13 |
|
||
|
Блокировка & буферизация (конкретный пример)
|
|||
|---|---|---|---|
|
#18+
guast-Я так понимаю надо использовать пессимистическую на уровне строк? -Тогда как сделать чтоб второй пользователь "ждал" пока первый изменит запись...как это происходит при буферизации? -И вообще надо ли это в моем случае?...может по старинке вернее будет?те не сможешь второго пользоветеля заставить "ждать" пока первый изменит запись. ты можешь только получить знак, что не все измененные записи удалось обновить. см. CURSORSETPROP("Buffering", ..), TABLECOMMIT(), TABLEREVERT(), BEGIN TRANSACTION, END TRANSACTION ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2006, 12:21 |
|
||
|
Блокировка & буферизация (конкретный пример)
|
|||
|---|---|---|---|
|
#18+
можно приблизительно так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2006, 12:39 |
|
||
|
Блокировка & буферизация (конкретный пример)
|
|||
|---|---|---|---|
|
#18+
изв. + Rollback конечно там в ифе где рету фолс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2006, 12:41 |
|
||
|
Блокировка & буферизация (конкретный пример)
|
|||
|---|---|---|---|
|
#18+
авторIf Txnlevel()<5 Думаю, здесь логическая ошибка. Если изменение данных происходит в транзакции, то излишне накладывать ещё одну транзакцию, причем откат её НЕ приведёт к откату транзакций верхних уровней. Так же она не нужна при условии что внешняя транзакция является 5-ым уровнем транзакции, тогда код не сработает корректно хотя все прочие условия выполнены. Код: plaintext 1. лишняя проверка на found(), поскольку используется ф-ия seek, которая возвращает успех поиска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2006, 13:13 |
|
||
|
Блокировка & буферизация (конкретный пример)
|
|||
|---|---|---|---|
|
#18+
If Txnlevel()<5 это для примера как ограничеть по количеству запущенных транзакций можно увеличить согласен if seek() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2006, 13:52 |
|
||
|
Блокировка & буферизация (конкретный пример)
|
|||
|---|---|---|---|
|
#18+
guastПри нажатии кнопки на форме необходимо увеличить cnt определенной даты строго на единицу. Приложение многопользовательское. Прежде, чем начать кодить, ответь на парочку вопросов: Весь процесс модификации заключается именно в увеличении счетчика на 1? Или изменяется что-то еще? Какие-то другие поля? Если модифицируется несколько полей, то как долго (по времени) пользователь может размышлять над тем, что именно менять? ПОСЛЕ увеличения счетчика на 1 другой пользователь может также увеличить этот счетчик еще на 1? Какое событие должно послужить сигналом к тому, что ДРУГОЙ пользователь теперь тоже может увеличить этот счетчик? Понимаешь, сама постановка вопроса, мягко говоря, странная. ЗАЧЕМ тут вообще какие-то буферизации, транзакции? Просто REPLACE и все. Он сам все и заблокирует и снимет блокировку. Т.е. в ТАКОЙ постановке ни о какой буферизации вообще речи не идет. Чистый DOS-подход. Цель буферизации - это разделить процесс внесения изменений и процесс сохранения этих изменений. Ну, как в программе Word. Ты сначала вводишь текст (это буфер) и только ПОТОМ нажимаешь кнопку "Сохранить", чтобы твои изменения были сохранены на диске. Есть ПРОЦЕСС изменения и ПРОЦЕСС сохранения. А в твоей постановке нет этих 2 процессов. Есть один общий процесс изменения-сохранения. Нет места для буферизации. Ни для какой. Ни для оптимистической, ни для пессимистической. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2006, 00:42 |
|
||
|
Блокировка & буферизация (конкретный пример)
|
|||
|---|---|---|---|
|
#18+
Hi guast! Пример абстрактный, и бессмысленный в такой постановке. UPDATE Mytable SET cnt=cnt+1 WHERE dt = m.MyDate по on error или другим обработчиком ошибок ловим всё что может случится - начиная от отсутствия таблицы и заканчивая чужим "интеллектуальным" кодом который повесил блокировку и держит её неограниченно долго. если тебе надо не просто нарастить счётчик, но ещё и ПОЛУЧИТЬ его текущее значение до изменения (т.е. вытащить cnt "наружу" команды обновления) - это совсем другое дело - тут нужна блокировка, либо нужно создать цикл, в котором снова и снова "запрашивать и обновлять" таблицу - до тех пор, пока не получим "стабильный" результат - т.е. что обновление реально "обработало" нужную нам запись (обычно одну), при этом никто не вмешался в процесс "между" тем как мы вынули старое значение и попытались записать новое. На этом принципе иногда строят NewID подобные процедуры - если явная блокировка невозможна или очень нежелательна. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 02:55 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33514817&tid=1592474]: |
0ms |
get settings: |
12ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
66ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
3ms |
| others: | 208ms |
| total: | 372ms |

| 0 / 0 |
