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

start [/forum/topic.php?fid=41&mobile=1&tid=1588211]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
67ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 326ms |

| 0 / 0 |
