|
Тема |
Re: несериозно оправдание? [re: bira_more] |
|
Автор |
wqw (АзСъмЖив) |
|
Публикувано | 17.12.08 00:02 |
|
|
Смятам, че се предоверяваш на salle -- той работи по репликацията а не по db-enigine-а.
Това което предлага wiz ("проверява дали реда е записан като зает, ако не е -> записва че е зает и го взема") са пълни глупости ако двете стъпки не се случват в транзакция -- дори предполагам, че в момента е така и има проблеми.
Идеята е, че трябва да сериализирате резервирането на редове. Сериализирате = да го направите да се случва серийно, т.е. ако двама потребители са опитват да резервират ред (без значение дали е един и същ или различни) нека това не се случва едновременно, а да се изчакват. Всякакъм друг достъп до таблицата (справки, UPDATE-и) не ни бъркат и няма да ги trottle-ваме.
Нямаме транзакции заради MyISAM-а, обаче забелязвам че разполагаме LOCK-ове на ресурси, конкретно гледам LOCK TABLES tbl_name.
Значи правим си една dummy таблица за целта и резервиране на ред за редакция става по следния начин:
1. LOCK на dummy
2. Намираме "свободен" за редакция (SELECT @free_id = id ... WHERE ...)
3. Маркираме като резервиран за редакция (UPDATE ... WHERE id = @free_id)
4. Пускаме LOCK на dummy
LOCK-а ни гарантира, че двама потребители няма да се "разминат" между 2-ра и 3-та стъпка. Т.е. user A 2. -> user B 2. -> user B 3. -> user A 3. -> ouch.
Съществува голяма вероятност да не съм разбрал "заданието", но и без друго нямаше какво да правя...
cheers,
</wqw>
|
| |
|
|
|