如下程序,为什么会出现死锁?

龙雪刚 发布于 2010/09/20 14:29
阅读 668
收藏 2

mysql> show create table test;
+-------+-----------------------------------------
| Table | Create Table
+-------+-----------------------------------------
| test  | CREATE TABLE `test` (
  `id` bigint(20) NOT NULL auto_increment,
  `master` bigint(20) NOT NULL,
  `markID` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `master` (`master`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------

mysql> select * from test;
+----+--------+--------+
| id | master | markID |
+----+--------+--------+
|  1 |      1 |    100 |
|  2 |      2 |    200 |
+----+--------+--------+
2 rows in set (0.00 sec)

procedure1:
begin
update test set markID = 200 where id =2;
update test set markID = 100 where id = 1;
end

procedure2:
begin
update test set markID = 100 where id = 1;
update test set markID = 200 where id =2;
end

两个存储过程同时调用,请问为什么会造成死锁啊?

加载中
0
龙雪刚

没人知道吗?这个问题困扰我两天了。

0
V
V

若若地认为是都没有提交造成滴

0
RayCheung
RayCheung

同意楼上的,没有COMMIT造成的吧。

0
龙雪刚

我特地让存储过程中不显示开启事务和提交事务,让它默认的为每一条SQL语句建立一个单独事务。

0
V
V

还是若若滴坚持刚才滴回答

0
龙雪刚

酸汤鱼,你能详细说一下你的看法吗?

0
张冬
张冬

你的mysql是行级锁嘛?

0
张冬
张冬

会不会是这样的。你创建的数据库时是行级锁(页级的典型代表引擎为BDB。表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。行级的典型代表引擎为INNODB。)。于是两个事务并发但是都锁了相应的行。于是两个事务相互等待,造成死锁。

0
V
V

Mysql锁机制造成滴,你上一个线程老是占着没有动作,下一线程如何来得到钥匙呢,

试着在每个update后commit下就Ok

这里有文档参考

http://www.91linux.com/html/article/database/mysql/20081115/13794.html

 

http://rainbowbridg.itpub.net/post/23663/307234

0
龙雪刚

关键是这两条SQL语句里面有事务的存在吗?

返回顶部
顶部