[size=large][color=red]在mysql的多个存储引擎中,innodb支持外键,但是由于外键,也会对innodb表增加锁定机制;[/color][/size]
[color=blue]所有的外键相关的操作都在数据更改时,比如检查数据完整性、增加锁定等;[/color]
假设一个表为test_tab,一个表为child,[b]test_tab通过id和child的test_tab_id相连接[/b];在一个session中set autocommit=0,执行对test_tab或child的操作,在另一个
session执行对child或test_tab的操作,从而得出以下结论:
[size=large][color=red]一、对父表的操作[/color][/size]
1:insert to test_tab,新插入行的id值为XXX
[color=blue]child会锁外键值为XXX的行,不会锁其他行[/color]
2:update test_tab,原id为XXX,现id为YYY
[color=blue]child会锁外键值为XXX,YYY的行,不会锁其他行[/color]
3:delete from test_tab,删除行的id为XXX
[color=blue]child会锁外键值为XXX,不会锁其他行[/color]
[size=large][color=red]二、对子表的操作[/color][/size]
1:insert to child,插入行的外键值为XXX
[color=blue]test_tab会锁值XXX的行,不会锁其他行[/color]
2:update child,更新行的外键值原为XXX,现为YYY
test_tab会锁XXX,YYY行,但要注意:存在间隔锁,也会锁其他行(XXX,YYY之间的位置)
3:delete from child,删除行的外键值为XXX
test_tab会锁XXX的行,但要注意:存在间隔锁,也会锁其他行(XXX-1的位置)
[color=blue]所有的外键相关的操作都在数据更改时,比如检查数据完整性、增加锁定等;[/color]
假设一个表为test_tab,一个表为child,[b]test_tab通过id和child的test_tab_id相连接[/b];在一个session中set autocommit=0,执行对test_tab或child的操作,在另一个
session执行对child或test_tab的操作,从而得出以下结论:
[size=large][color=red]一、对父表的操作[/color][/size]
1:insert to test_tab,新插入行的id值为XXX
[color=blue]child会锁外键值为XXX的行,不会锁其他行[/color]
2:update test_tab,原id为XXX,现id为YYY
[color=blue]child会锁外键值为XXX,YYY的行,不会锁其他行[/color]
3:delete from test_tab,删除行的id为XXX
[color=blue]child会锁外键值为XXX,不会锁其他行[/color]
[size=large][color=red]二、对子表的操作[/color][/size]
1:insert to child,插入行的外键值为XXX
[color=blue]test_tab会锁值XXX的行,不会锁其他行[/color]
2:update child,更新行的外键值原为XXX,现为YYY
test_tab会锁XXX,YYY行,但要注意:存在间隔锁,也会锁其他行(XXX,YYY之间的位置)
3:delete from child,删除行的外键值为XXX
test_tab会锁XXX的行,但要注意:存在间隔锁,也会锁其他行(XXX-1的位置)