|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Max Khon 2:5000/79.666 12 Oct 2001 09:21:44 To : Anton Voronin Subject : MySQL: transactions vs locks -------------------------------------------------------------------------------- 12 Oct 01 00:29, Anton Voronin wrote to All: AV> Как я выяснил опытным путем, когда в Mysql активна транзакция, то не AV> работают блокировки (LOCK молчаливо проходит, а на UNLOCK сервер AV> падает по SIGSEGV со словами "...you probably hit a bug..."). И наоборот, AV> если хоть одна таблица в базе блокирована, то не работают транзакции AV> (AutoCommit не устанавливается в 0. ну это на самом деле наверно косяк -- пиши багрепорт AV> Значит нужно использовать либо то, либо другое. Hапример, когда AV> запросов на изменение (UPDATE/INSERT/etc...) не больше одного, а AV> остальные - SELECT'ы, то можно обойтись только блокировками, без AV> транзакций, так как целостности AV> базы ничего не угрожает. А если все запросы - на изменение данных, то AV> можно обойтиь без блокировок, только транзакциями (потому как вся AV> последовательность выполняется за одну атомарную операцию и никто AV> другой не сможет внести изменения между запросами этой транзакции). слушай, а там разве нормальный locking не сделали? я в том смысле когда лочится не вся таблица а только строчки или еще лучше mvcc как в pgsql или oracle. если не сделали то не совсем понятно как они сделали транзакции. AV> Hо что делать, если и update'ов/insert'ов больше нуля, а select'ов AV> больше одного? Транзакция здесь нужна обязательно, но если не делать AV> блокировок, то: AV> 1. В случае когда сначала делается select, а потом на основе AV> выбранных AV> им данных делаются обновления, существует ли гарантия, что между AV> селектом AV> и апдейтом не внесено изменений другим пользователем в базу таким AV> образом, AV> что данные, на которых основывается дальнайший update, окажутся AV> неактуальными? Ведь несмотря на транзакцию, select все равно делается AV> сразу, а не во время commit'а. для таких вещей есть select for update AV> 2. В случае когда сначала делается серия обновлений, а потом select, AV> который должен отразить эти изменения, не будет ли он читать данные из AV> исходной таблицы, в которой изменения еще не отражены, поскольку коммита AV> еще не было? если в той же транзакции, то будет читать проапдейченные данные если в другой, то зависит от transaction isolation level в общем я думаю с обоими вопросами лучше в su.dbms -- люди там добрые и отзывчивые а вообще по-моему все это решается переходом на postgresql, но мой совет основан только на том, что я не знаю как там у mysql с транзакциями и локами (последний раз его трогал очень давно, когда там были только table level locks и не было транзакций) у potsgresql'я конечно тоже своих косяков достаточно, но чтобы решить твои вопросы -- там средств точно хватит насколько я понимаю использовать oracle или db2 ты не можешь /fjoe --- Msged/BSD TE 06 (pre) * Origin: the number of the beast is vi vi vi (2:5000/79.666) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/40593bc6d17b.html, оценка из 5, голосов 10
|