Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> eadlock found when trying to get lock; 
:(
    Опции темы
chiffa
Дата 28.5.2015, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 734
Регистрация: 11.11.2003

Репутация: нет
Всего: -1



Всем доброе время суток. Есть MySQL - процедура в которой выполняются последовательно следущие действия:

Код

SELECT INTO ***
SELECT INTO ***
SELECT INTO ***

UPDATE table1 SET table1.name = ***;
UPDATE table1 SET table1.fname = ***;

INSERT INTO table2



Средняя частота вызова данной процедуры 100 запросов в минуту. Время от времени (то есть закономерности нет) возникает ошибка:

Код

com.mysql.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction


и отрабатывает только первый апдейт (UPDATE table1 SET table1.name = ***;) или  ооочень редко первый и второй, до инсерта дело не доходит. Насколько я понимаю, дело в том, что в этот момент, кто то еще может выполнять какие дейсвтия в этой таблицей. 
Подскажите, как бороться с этой проблемой? таблицы InnoDB, поля пот которым идет поиск индексированы.

Спасибо заранее за помощь!
PM MAIL   Вверх
Akina
Дата 28.5.2015, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Приведите полный текст запросов процедуры. Промежуточную арифметику можно опустить, но указать место её расположения.
Просто УЖЕ возникают вопросы. Например, какого рожна там идут ДВА апдейта одной и той же таблицы? почему не один? Откуда появляется транзакция? по тексту её нет... а если всё-таки есть - какой выставлен уровень изоляции? Запросы на выполнение процедуры идут синхронно или нет? 
В общем, мало данных для осмысленного ответа, одни вопросы.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
chiffa
Дата 28.5.2015, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 734
Регистрация: 11.11.2003

Репутация: нет
Всего: -1



Спасибо за ответ!
Код

OperexchADD:BEGIN

DECLARE GetOrderNum int(4);
DECLARE PfToPlus, ArmyPayPlus INT(10);
DECLARE get_cur_user_ball, get_cur_user_coming, get_cur_user_cons INT (20);
DECLARE get_cod_u_ball, get_cod_u_coming, get_cod_u_cons INT (20);
DECLARE BalNew_CCY, ComNew_CCY, COnsNew_CCY, BalNew_UAH, ComNew_UAH, ConsNew_UAH INT (10);



IF (select count(*) from exchange.tmp_con WHERE connection_id = connection_id())>0 THEN
UPDATE exchange.tmp_con SET user_id = (SELECT user_id FROM main.sid WHERE session_id = sid_ins) WHERE connection_id = connection_id();
else 
INSERT INTO exchange.tmp_con (connection_id, user_id) VALUES (connection_id(), (SELECT user_id FROM main.sid WHERE session_id = sid_ins));
END IF;

SET @PfToPlus=0;
SET @ArmyPayPlus=0;


if (OperType_ins = 2 and (SELECT value FROM main.settings WHERE `keys` = 'PF_buy') = 1) THEN SET @PfToPlus=PfUAH_ins*100; END IF;
if (OperType_ins = 3 and (SELECT value FROM main.settings WHERE `keys` = 'PF_sell') = 1) THEN SET @PfToPlus=PfUAH_ins*100; END IF;

if (OperType_ins = 2 and (SELECT value FROM main.settings WHERE `keys` = 'PF_buy') = 1) THEN SET @ArmyPayPlus=ArmyPay_ins*100; END IF;
if (OperType_ins = 3 and (SELECT value FROM main.settings WHERE `keys` = 'PF_sell') = 1) THEN SET @ArmyPayPlus=ArmyPay_ins*100; END IF;


IF (SELECT user_id FROM main.sid WHERE session_id = sid_ins) !=0 THEN

  SELECT 
  curo.balance, curo.coming, curo.cons
  INTO
  get_cur_user_ball, get_cur_user_coming, get_cur_user_cons
  FROM cur_oper_day curo
  WHERE  curo.user_id = (SELECT user_id FROM main.sid WHERE session_id = sid_ins) and curo.ccy_id = (SELECT id FROM ccy WHERE ccy = CCYtoEx_ins);

SELECT cod_u.balance, cod_u.coming, cod_u.cons 
INTO
get_cod_u_ball, get_cod_u_coming, get_cod_u_cons
FROM cur_oper_day cod_u WHERE cod_u.user_id = (SELECT user_id FROM main.sid WHERE session_id = sid_ins) and cod_u.ccy_id = 1;


SET @GetOrderNum = (SELECT COUNT(*) FROM operexch a WHERE 
a.branch_id = BranchId_ins and a.office_id = OfficeId_ins and a.OperDate = concat (
SUBSTRING_INDEX(SUBSTRING_INDEX(OperDate_ins, '.', 3), '.', -1), "-",
SUBSTRING_INDEX(SUBSTRING_INDEX(OperDate_ins, '.', 2), '.', -1), "-",
SUBSTRING_INDEX(OperDate_ins, '.', 1)) and a.`status` not in (14))+1; 



IF OperType_ins = 2 THEN


SELECT (a.balance + (CCYSum_ins*100)), (a.coming + (CCYSum_ins*100))
INTO 
BalNew_CCY, ComNew_CCY
FROM cur_oper_day a WHERE a.user_id = (SELECT user_id FROM main.sid WHERE session_id = sid_ins) and a.ccy_id = (SELECT id FROM ccy WHERE ccy = CCYtoEx_ins);


SELECT ( a.balance - (SymToColl_ins*100)), (a.cons + (SymToColl_ins*100))
INTO 
BalNew_UAH, ConsNew_UAH
FROM cur_oper_day a WHERE a.user_id = (SELECT user_id FROM main.sid WHERE session_id = sid_ins) and a.ccy_id = 1;


if ( BalNew_CCY is null) or (BalNew_CCY < 0) then
SELECT 'erorr_msg', '<html> <font color="red"> ball val err </font> </html>' as 'msg';
LEAVE OperexchADD;
end if;

if ( ComNew_CCY is null) or (ComNew_CCY < 0) then
SELECT 'erorr_msg', '<html> <font color="red"> com err </font> </html>' as 'msg';
LEAVE OperexchADD;
end if;

if ( BalNew_UAH is null) or (BalNew_UAH < 0) then
SELECT 'erorr_msg', '<html> <font color="red"> bal uah err </font> </html>' as 'msg';
LEAVE OperexchADD;
end if;

if ( ConsNew_UAH is null) or (ConsNew_UAH < 0) then
SELECT 'erorr_msg', '<html> <font color="red"> cons err </font> </html>' as 'msg';
LEAVE OperexchADD;
end if;




  UPDATE cur_oper_day a SET a.balance = (a.balance + (CCYSum_ins*100)), a.coming = (a.coming + (CCYSum_ins*100)) WHERE a.user_id = (SELECT user_id FROM main.sid WHERE session_id = sid_ins) and a.ccy_id = (SELECT id FROM ccy WHERE ccy = CCYtoEx_ins);
  UPDATE cur_oper_day a SET a.balance = ( a.balance - (SymToColl_ins*100)), a.cons = (a.cons + (SymToColl_ins*100)) WHERE a.user_id = (SELECT user_id FROM main.sid WHERE session_id = sid_ins) and a.ccy_id = 1;
  
END IF;


IF OperType_ins = 3 THEN



SELECT (a.balance - (CCYSum_ins*100)), (a.cons + (CCYSum_ins*100))
INTO 
BalNew_CCY, COnsNew_CCY
FROM cur_oper_day a WHERE a.user_id = (SELECT user_id FROM main.sid WHERE session_id = sid_ins) and a.ccy_id = (SELECT id FROM ccy WHERE ccy = CCYtoEx_ins);


SELECT (a.balance + (SymToColl_ins*100) + @PfToPlus + @ArmyPayPlus), (a.coming + (SymToColl_ins*100) + @PfToPlus + @ArmyPayPlus)
INTO 
BalNew_UAH, ComNew_UAH
FROM cur_oper_day a WHERE a.user_id = (SELECT user_id FROM main.sid WHERE session_id = sid_ins) and a.ccy_id = 1;




if ( BalNew_CCY is null) or (BalNew_CCY < 0) then
SELECT 'erorr_msg', '<html> <font color="red"> ball val err </font> </html>' as 'msg';
LEAVE OperexchADD;
end if;


if ( COnsNew_CCY is null) or (COnsNew_CCY < 0) then
SELECT 'erorr_msg', '<html> <font color="red"> cons err </font> </html>' as 'msg';
LEAVE OperexchADD;
end if;


if ( BalNew_UAH is null) or (BalNew_UAH < 0) then
SELECT 'erorr_msg', '<html> <font color="red"> bal uah </font> </html>' as 'msg';
LEAVE OperexchADD;
end if;


if ( ComNew_UAH is null) or (ComNew_UAH < 0) then
SELECT 'erorr_msg', '<html> <font color="red"> Com err </font> </html>' as 'msg';
LEAVE OperexchADD;
end if;




  UPDATE cur_oper_day a SET a.balance = (a.balance - (CCYSum_ins*100)), a.cons = (a.cons + (CCYSum_ins*100)) WHERE a.user_id = (SELECT user_id FROM main.sid WHERE session_id = sid_ins) and a.ccy_id = (SELECT id FROM ccy WHERE ccy = CCYtoEx_ins);
  UPDATE cur_oper_day a SET a.balance = (a.balance + (SymToColl_ins*100) + @PfToPlus + @ArmyPayPlus), a.coming = (a.coming + (SymToColl_ins*100) + @PfToPlus + @ArmyPayPlus) WHERE a.user_id = (SELECT user_id FROM main.sid WHERE session_id = sid_ins) and a.ccy_id = 1;

END IF;    


INSERT INTO operexch (`user_id`, `CCYPf`, `branch_id`, `office_id`, `OperDate`, `PfUAH`, `ArmyPay`,`CustId`, `CCYtoEx`, `SymToColl`, `OperType`, `OrderNum`, `CtimeSend`, `CtimeAdd`, `CCYRate`, `CCYSum`, `CrtNum`,`status`, time)
VALUES ((SELECT user_id FROM main.sid WHERE session_id = sid_ins), CCYPf_ins*100, BranchId_ins, OfficeId_ins, 

concat (
SUBSTRING_INDEX(SUBSTRING_INDEX(OperDate_ins, '.', 3), '.', -1), "-",
SUBSTRING_INDEX(SUBSTRING_INDEX(OperDate_ins, '.', 2), '.', -1), "-",
SUBSTRING_INDEX(OperDate_ins, '.', 1)),  PfUAH_ins*100, ArmyPay_ins*100,CustId_ins, (SELECT id FROM ccy WHERE ccy = CCYtoEx_ins), SymToColl_ins*100, OperType_ins, @GetOrderNum, CtimeSend_ins, NOW(), CCYRate_ins, CCYSum_ins*100, CrtNum_ins, 10, UNIX_TIMESTAMP ());

SELECT "LoadExch_ok", @GetOrderNum as "OrderNum"; 


ELSE

SELECT "auth_err";

END IF;

END

PM MAIL   Вверх
Akina
Дата 28.5.2015, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



В приведённом - количество IF явно превосходит количество END IF. И кавычки в последних строках процедуры какие-то подозрительно файрбёрдовские... а LEAVE на начало процедуры?
А можно настоящий, рабочий на сервере MySQL, текст?



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
chiffa
Дата 28.5.2015, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 734
Регистрация: 11.11.2003

Репутация: нет
Всего: -1



та вообщем то и есть копи - паст. Где ИФ не закрыто?.... Какие кавычки не те?...
PM MAIL   Вверх
Akina
Дата 28.5.2015, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(chiffa @  28.5.2015,  12:04 Найти цитируемый пост)
Где ИФ не закрыто?

Да, насчёт IF просчитался - отвык от нескольких операторов в одной строке.

Цитата(chiffa @  28.5.2015,  12:04 Найти цитируемый пост)
Какие кавычки не те?... 

Код

SELECT "LoadExch_ok", @GetOrderNum as "OrderNum"; 
Для алиаса по науке должны использоваться бэктики, вроде бы как... хотя ошибки двойная кавычка и не вызовет.

Но остался последний вопрос - откуда взялась транзакция? Чему равен AUTOCOMMIT? Может, сделать, как рекомендует мануал:
Код

SET AUTOCOMMIT = 0;
LOCK TABLES cur_oper_day AS a WRITE, main.sid READ LOCAL, ccy READ LOCAL;
UPDATE ... ;
UPDATE ... ;
UNLOCK TABLES;



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.