SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.03.2011 22:06:08

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Блокировка строк и уровни изоляции

Добрый вечер, у меня появилась необходимость по блокировки отдельных строк в Innodb на чтение. В книгах пишут что уровень изоляции SERIALIZABLE в транзакциях блокирует все строки на чтение и запись которые затронет даная транзакция. Но на практике у меня выходит совсем инное. Перепробовал все уровни изоляции и не одна почему то не блокирует строку на чтение, добавление индексов на столбцы тоже не дало результатов. Вобщем пока к SELECT'y не поставил FOR UPDATE, блокировок на чтение не получил. В книгах пишут что при уровни SERIALIZABLE все SELECT'ы автоматом стают как с FOR UPDATE, но мне почему то этот FOR UPDATE приходится добавлять явно. Проблема в принципе решена но мне хотелось бы понять почемю так происходит. спасибо

Отредактированно simple (24.03.2011 22:11:56)

Неактивен

 

#2 24.03.2011 22:41:45

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Блокировка строк и уровни изоляции

SERIALIZABLE вы где ставите? Он должен стоять у всех транзакций, которые
обращаются к строкам.

Неактивен

 

#3 24.03.2011 23:56:30

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Блокировка строк и уровни изоляции

Я так и делаю, перед всеми транзакциями пишу SET TRANSACTION IZOLATION LEVEL SERIALIZABLE. Но все равно пока явно не укажешь блокировку на чтение, она не срабатывает.

Неактивен

 

#4 25.03.2011 02:08:40

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Блокировка строк и уровни изоляции

Не верю

Код:

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

Неактивен

 

#5 25.03.2011 02:55:29

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Блокировка строк и уровни изоляции

Сделал в точности как Вы написали...Не выходит...Я тут подумал, может все дело в клиенте? Я использую не сдандартный Mysql клиент, а HeidiSQL, может он играет со мной. Кстати он выдает ошибку на конструкцию BEGIN вместо START TRANSACTION.

Неактивен

 

#6 25.03.2011 03:26:47

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Блокировка строк и уровни изоляции

Почему я через стандартный клиент не могу выбрать базу данных?! mysql>use test; Database changed пишет сервер, в чем дело то?

Неактивен

 

#7 25.03.2011 03:31:57

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Блокировка строк и уровни изоляции

Database changed - значит, что база выбрана smile

Неактивен

 

#8 25.03.2011 05:31:02

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Блокировка строк и уровни изоляции

Ничего не понятно с этим shell клиентом, при запуске запрашивает только пароль от root, а как же входить в БД другим пользавателям тогда если логин не запрашивается?

Неактивен

 

#9 25.03.2011 15:16:50

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Блокировка строк и уровни изоляции

mysql -uotheruser?

Неактивен

 

#10 28.03.2011 16:37:55

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Блокировка строк и уровни изоляции

И куда это вводить? У меня при запуске клиента сразу пароль запрашивает

Неактивен

 

#11 28.03.2011 19:28:03

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Блокировка строк и уровни изоляции

Насколько я понимаю - у вас винда, тогда
запустите виндовую консоль (Пуск --> Выполнить --> набираете cmd), переходите в каталог bin сервера mysql и вызываете консольный клиент под нужным вам пользователем.

Неактивен

 

#12 29.03.2011 01:57:14

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Блокировка строк и уровни изоляции

Спасибо

Неактивен

 

#13 25.11.2011 02:35:35

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Блокировка строк и уровни изоляции

Почему все таки ISOLATION LEVEL SERIALIZABLE не блокирует строку при выборке?
делаю так:


mysql>SET TRANSACTION ISOLATION LEVEL SERIALISABLE;
mysql>START TRANSACTION;
mysql>SELECT*FROM tmp WHERE id=1;
 


Запускаю второй клиент и там пишу тоже самое, НО таблица почему то читается (

Почему так ведь этот уровень самый самый вроде как мне изветсно

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson