|
Тема |
Re: ами ... [re: salle] |
|
Автор |
wqw (АзСъмЖив) |
|
Публикувано | 18.12.08 01:56 |
|
|
Чувствам се задължен да измуча, макар и да си "нахранил" wiz.
Auto-commit-а на MyISAM е дълбока моя заблуда. Сега вече "прогледнах" и опасенията ми се сбъднаха на 100% -- по-добре да работя с .txt файлове отколкото с подобна "RDBMS".
bira_more може и да чете, но надали разбира какво точно се случва при твоето предложение. Прекъсни ме ако греша в следващите обяснения, в които ще се опитам да развенчая заблудата, в която ти лично го въведе, че едва ли не със SELECT ... FOR UPDATE ще постигне single row lock върху първия ред подходящ за резервация.
0. Приемам, че InnoDB е относителна стандартна имплементация на RDBMS без да съм запознат с конкретната имплементация.
1. Нека заявката изглежда така SELECT * FROM MyTable WHERE IsReserved = 0 FOR UPDATE
2. Нека в MyTable имаме няколко реда с IsReserved = 1
3. В зависимост от коректността на статистиките на db engine-а + ефективността на алгоритмите за lock escalation, съм готов да се обзаложа че в 95%+ от случаите заявката ще "осъмне" с tab lock.
4. Ако има индекс по IsReserved (нещо безумно като изпълнение, но "решение" което с голяма вероятност wiz би придложил гледайки предиката в WHERE клаузата на заявката) 100% от случаите ще имаме index lock на целия индекс.
5. В зависимост от нивото на изолация на транзакциите db engine-а може да се опита да предотврати "фантоми" и веднага ще сложи tab lock
6. "На око" вероятността само за row lock-ове при подобна заявка е минимална.
Сега виждам това предложение:
UPDATE x SET ......,
processed = (@las_processed := UUID()) ...
WHERE processed IS NULL LIMIT 1;
Питам се, след като на MyISAM му липсва A-то в ACID-а, може ли две сесии да UPDATE-нат един и същ ред едновременно и в резултат това:
SELECT ... WHERE processed = @last_processed;
... да не върне нищо? Склонен съм да предположа, че бирата и Co. ще го докажат в практиката или по-рано ако стрес-тестват. Без транзакции е тегаво, а веселбата с MyISAM е пълна. Бих се хванал за custom lock-овете като удавник за сламка в случая. Добре че понe има work around за емулация на critical section-и.
cheers,
</wqw>
|
| |
|
|
|