Задавайте вопросы, мы ответим
Вы не зашли.
Добрый вечер, у меня появилась необходимость по блокировки отдельных строк в Innodb на чтение. В книгах пишут что уровень изоляции SERIALIZABLE в транзакциях блокирует все строки на чтение и запись которые затронет даная транзакция. Но на практике у меня выходит совсем инное. Перепробовал все уровни изоляции и не одна почему то не блокирует строку на чтение, добавление индексов на столбцы тоже не дало результатов. Вобщем пока к SELECT'y не поставил FOR UPDATE, блокировок на чтение не получил. В книгах пишут что при уровни SERIALIZABLE все SELECT'ы автоматом стают как с FOR UPDATE, но мне почему то этот FOR UPDATE приходится добавлять явно. Проблема в принципе решена но мне хотелось бы понять почемю так происходит. спасибо
Отредактированно simple (24.03.2011 22:11:56)
Неактивен
SERIALIZABLE вы где ставите? Он должен стоять у всех транзакций, которые
обращаются к строкам.
Неактивен
Я так и делаю, перед всеми транзакциями пишу SET TRANSACTION IZOLATION LEVEL SERIALIZABLE. Но все равно пока явно не укажешь блокировку на чтение, она не срабатывает.
Неактивен
Не верю
client1> CREATE TABLE t (a INT KEY) ENGINE = InnoDB; Query OK, 0 rows affected (0.01 sec) client1> INSERT INTO t VALUES (1), (2), (3), (4), (5); Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0 client1> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; Query OK, 0 rows affected (0.00 sec) client1> BEGIN; Query OK, 0 rows affected (0.00 sec) client1> SELECT * FROM t WHERE a = 3; -- блокирует строку +---+ | a | +---+ | 3 | +---+ 1 row in set (0.00 sec) -- подключаемся параллельно вторым клиентом client2> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; Query OK, 0 rows affected (0.00 sec) client2> BEGIN; Query OK, 0 rows affected (0.00 sec) client2> DELETE FROM t WHERE a = 5; --незаблокированная строка Query OK, 1 row affected (0.00 sec) client2> DELETE FROM t WHERE a = 3; --заблокированная строка ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Неактивен
Сделал в точности как Вы написали...Не выходит...Я тут подумал, может все дело в клиенте? Я использую не сдандартный Mysql клиент, а HeidiSQL, может он играет со мной. Кстати он выдает ошибку на конструкцию BEGIN вместо START TRANSACTION.
Неактивен
Почему я через стандартный клиент не могу выбрать базу данных?! mysql>use test; Database changed пишет сервер, в чем дело то?
Неактивен
Database changed - значит, что база выбрана
Неактивен
Ничего не понятно с этим shell клиентом, при запуске запрашивает только пароль от root, а как же входить в БД другим пользавателям тогда если логин не запрашивается?
Неактивен
mysql -uotheruser?
Неактивен
И куда это вводить? У меня при запуске клиента сразу пароль запрашивает
Неактивен
Насколько я понимаю - у вас винда, тогда
запустите виндовую консоль (Пуск --> Выполнить --> набираете cmd), переходите в каталог bin сервера mysql и вызываете консольный клиент под нужным вам пользователем.
Неактивен
Спасибо
Неактивен
Почему все таки ISOLATION LEVEL SERIALIZABLE не блокирует строку при выборке?
делаю так:
Неактивен