|
|
|
RLOCK / LOCK
|
|||
|---|---|---|---|
|
#18+
Есть вопрос, нужно временно заблокировать одну запись / поле чтобы можно было записать в нее значение и успеть его считать, так чтобы кто-то в сети за это промежуток времени, хоть и очень малый, не успел перебить это значение (вопрос уникальности ключей и интенсиивная работа одновремменых устройств.) LOCK / RLOCK даже при успешной блокировке, разрешают почему-то делать Update.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 18:41 |
|
||
|
RLOCK / LOCK
|
|||
|---|---|---|---|
|
#18+
update ждет освобождения записи. Проблема вероятно в том что чтение происходит до блокировки и update пишет что-то производное от прочитанного. Блокировка чтение не блокирует, только запись. Например порядок такой: 1. Прочитать значение 2. заблокировать запись 3. изменить значение на +1 4. разблокировать то при одновременном выполнении два разных пользователя выполнят одно и то же. Прочитают одновременно, а запишут по очереди. Т.е. вместо +2 окажется +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 18:53 |
|
||
|
RLOCK / LOCK
|
|||
|---|---|---|---|
|
#18+
Продолжая не законченную фразу, надо изменить последовательность действий: 1. Попытаться заблокировать запись 2. Если удалось заблокировать, читаем и изменяем значение 3. Снимаем блокировку. Т.е. читать не ДО, а ПОСЛЕ успешной блокировки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 19:03 |
|
||
|
RLOCK / LOCK
|
|||
|---|---|---|---|
|
#18+
используйте буферизацию и requery() получите сброс информации и одновременно считывание ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 19:52 |
|
||
|
RLOCK / LOCK
|
|||
|---|---|---|---|
|
#18+
я бы поменял порядок автор1. Прочитать значение 2. заблокировать запись 3. изменить значение на +1 4. разблокировать сделал бы так: 1.заблокировать запись 2.Прочитать значение 3. изменить значение на +1 4. разблокировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 19:55 |
|
||
|
RLOCK / LOCK
|
|||
|---|---|---|---|
|
#18+
ВладимирМПродолжая не законченную фразу, надо изменить последовательность действий: 1. Попытаться заблокировать запись 2. Если удалось заблокировать, читаем и изменяем значение 3. Снимаем блокировку. Т.е. читать не ДО, а ПОСЛЕ успешной блокировки упс.. экскьюзми уже поменяли.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 19:57 |
|
||
|
RLOCK / LOCK
|
|||
|---|---|---|---|
|
#18+
упс.. база фоксовая.. requ() не покатит.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 20:06 |
|
||
|
RLOCK / LOCK
|
|||
|---|---|---|---|
|
#18+
В принципе, можно и без явных блокировок, но в этом случае придется ставить бесконечный цикл именно на случай изменения значений другим пользователем. Если написать код "в чистом виде", то это будет примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Смысл в том, что в команде UPDATE-SQL модифицируется не просто запись с нужным значением ключа, но и с тем значением изменяемого поля, которое было прочитано изначально. До модификации. Если такой записи нет (_TALLY=0), то это значит, что запись была изменена другим пользователем именно в промежуток между считыванием старого значения и его модификацией. В этом случае повторяем операцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2008, 22:52 |
|
||
|
RLOCK / LOCK
|
|||
|---|---|---|---|
|
#18+
ВладимирМВ принципе, можно и без явных блокировок, но в этом случае придется ставить бесконечный цикл ... Красивое решение, но я бы еще одну проверку добавил, чтобы не зациклилось случайно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2008, 09:18 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=35105353&tid=1588211]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
76ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 348ms |

| 0 / 0 |
