日期:2014-05-16  浏览次数:20655 次

阻塞到底是怎么回事?
阻塞定义
  当来自应用程序的第一个连接控制锁而第二个连接需要相冲突的锁类型时,将发生阻塞。其结果是强制第二个连接等待,而在第一个连接上阻塞。不管是来自同一应用程序还是另外一台客户机上单独的应用程序,一个连接都可以阻塞另一个连接。 



如果不是死锁, 一段时间后第一个连接执行完后, 第二个连接接着执行, 二个连接就都执行完了.
而第一个连接为什么被阻塞了,却一点都不明白. 这样的话不就成了死锁了吗?
------解决方案--------------------
楼主看下这里就明白了 http://www.qinbin.me/the-difference-between-the-mysql-database-blocking-and-deadlocks/
------解决方案--------------------
当阻塞成为一个环状时,就成了死锁,而你上面的定义,应该可以理解为:
当会话A,由于某些原因,比如性能问题,update一个几千万的表,速度肯定慢,要执行很久,这时候A会对表加上锁,可能直接就是表锁。
这时候,会话B要进行同一个表的DELETE操作,那么就必须等待Aupdate完,你才可以进行delete
------解决方案--------------------
互相占有对方需要获取的资源的现象叫做死锁

第一个连接占有tb表没有释放资源,而第二个连接一直在等待第一个连接释放该资源, 叫阻塞,。原因可能就是因为第一个没有提交或者回滚
------解决方案--------------------
引用:
Quote: 引用:

当阻塞成为一个环状时,就成了死锁,而你上面的定义,应该可以理解为:
当会话A,由于某些原因,比如性能问题,update一个几千万的表,速度肯定慢,要执行很久,这时候A会对表加上锁,可能直接就是表锁。
这时候,会话B要进行同一个表的DELETE操作,那么就必须等待Aupdate完,你才可以进行delete


但是我的会话A不会同时更新那么多数据呀,最多也就十几行,也不会等待很长时间呀
也就是说这十几行更新完后,语句就执行完了。会话B就可以接着执行了。怎么会有阻塞呢?
我是假设而已,你的例子中只是引入了A,B,可能A被C阻塞了
------解决方案--------------------
引用:
阻塞:是不是可以理解为,只要第一个阻塞者执行完了,其它都会排队依次执行,也就是说不用人为干预,所有阻塞会话会依次执行(只不过是时间问题)?
简单的阻塞是可以这样理解,不过不排除有些复杂的阻塞。比如一个查询进行并发查询,那么线程之间存在了阻塞,也就是自己阻塞了自己
------解决方案--------------------
引用:
Quote: 引用:

当阻塞成为一个环状时,就成了死锁,而你上面的定义,应该可以理解为:
当会话A,由于某些原因,比如性能问题,update一个几千万的表,速度肯定慢,要执行很久,这时候A会对表加上锁,可能直接就是表锁。
这时候,会话B要进行同一个表的DELETE操作,那么就必须等待Aupdate完,你才可以进行delete


但是我的会话A不会同时更新那么多数据呀,最多也就十几行,也不会等待很长时间呀
也就是说这十几行更新完后,语句就执行完了。会话B就可以接着执行了。怎么会有阻塞呢?


你有考虑过显示事物的操作么? 如果这个事务没有提交呢?