MySQLTransactionRollbackException: обнаружена тупиковая ситуация при попытке получить блокировку;JAVA

Программисты JAVA общаются здесь
Anonymous
MySQLTransactionRollbackException: обнаружена тупиковая ситуация при попытке получить блокировку;

Сообщение Anonymous »

У меня есть таблица trade_order:

Код: Выделить всё

 CREATE TABLE `trade_order` IF NOT EXISTS `buyer_order` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_no` varchar(30) NOT NULL DEFAULT '',
`name` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `order_no` (`order_no`),
)
Теперь я хочу вставить данные в таблицу trade_order. Я делаю это так:

Код: Выделить всё

transaction begin.
===
result = select * from order_table where order_no = #{orderNo} for update
if(result is null){
insert into trade_order (order_no,name) values (orderNo,name)
}
else{
update trade_order set name = #{name} where order_no = #{orderNo}
}
===
transaction end.
Но у меня есть исключение DeadLock:

Код: Выделить всё

 org.springframework.dao.DeadlockLoserDataAccessException:
### Error updating database.  Cause:      com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock      found when trying to get lock; try restarting transaction
### The error may involve      com.youzan.trade.process.datasync.dal.dao.OrderDAO.insert-Inline
### The error occurred while setting parameters
### SQL: insert into trade_order ( order_no, name )  values ( ?,         ?,  )
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
; SQL []; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
Может быть, два потока будут обрабатывать одни и те же два данных одновременно, и оба потока будут выполнять действие вставки.

Но приведет ли это к DeadLock? Интересно, почему.

(Уровень изоляции транзакции mysql — RR, движок InnoDB)>

Вернуться в «JAVA»