SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 05.04.2011 12:17:28

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Транзакции

Есть запрос к базе на хостинге, он вызывается удаленной программой каждые 3 секунды при этом возможны обрывы связи, сам запрос выглядит так:

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN
SELECT * FROM new_rcorder WHERE 1
DELETE FROM new_rcorder WHERE 1
COMMIT

Какой лучше выставить уровень изоляции чтобы пользователи не страдали от dead lock и задержек?

Отредактированно septera (05.04.2011 12:17:44)

Неактивен

 

#2 05.04.2011 12:20:47

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Транзакции

Мне кажется SERIALIZABLE точно нужно под нож, а что поставить ему на замену...
На одном из сайтов нашел текст после которого вообще перестал понимать какие уровни поддерживаются в MySQL:

http://phpclub.ru/mysql/doc/innodb-transaction-model.html написал:

В версиях старше 4.0.5 вы можете использовать только REPEATABLE READ и SERIALIZABLE.

Получается что READ COMMITTED не поддерживается?

Отредактированно septera (05.04.2011 12:21:10)

Неактивен

 

#3 07.04.2011 12:47:21

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Транзакции

Апну разок.

Неактивен

 

#4 08.04.2011 21:34:44

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

Re: Транзакции

Я правильно понимаю, что смысл этого безобразия — прочитать данные из
таблички одним потоком, а потом удалить их? Лучше тогда это делать вообще
не через транзакции, а блокировкой таблицы:

LOCK TABLES new_rcorder WRITE;
SELECT * FROM new_rcorder;
TRUNCATE new_rcorder;
UNLOCK TABLES;

Что касается второго вопроса — поддерживаются все уровни изоляции, включая
READ COMMITTED и READ UNCOMMITTED, разумеется.

Да, не объяснил, почему блокировка таблицы лучше. Потому что когда прийдет
два потока, и один начнет читать строки снизу, а второй сверху — будет deadlock.
А в случае блокировки таблицы целиком — второй не прийдет smile

Неактивен

 

#5 11.04.2011 10:18:06

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Транзакции

Да, кроме как безобразием по другому и не назовешь.
Сделал по другому, сначала получаем записи:

BEGIN
SELECT * FROM new_rcorder WHERE 1

Далее обрабатываем полученные строки, получаем первичный индекс id и по нему-то удаляем строки:

DELETE FROM new_rcorder WHERE id=21 OR id=22...
COMMIT

Таким образом с блокировками не должно быть проблем.

Отредактированно septera (11.04.2011 10:18:56)

Неактивен

 

Board footer

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