表的死锁是怎么造成的?都有哪些情况?

解决方案 »

  1.   

    具体看SQL联机帮助
    当某组资源的两个或多个线程之间有循环相关性时,将发生死锁。死锁是一种可能发生在任何多线程系统中的状态,而不仅仅发生在关系数据库管理系统中。多线程系统中的一个线程可能获取一个或多个资源(如锁)。如果正获取的资源当前为另一线程所拥有,则第一个线程可能必须等待拥有线程释放目标资源。这时就说等待线程在那个特定资源上与拥有线程有相关性。如果拥有线程需要获取另外一个资源,而该资源当前为等待线程所拥有,则这种情形将成为死锁:在事务提交或回滚之前两个线程都不能释放资源,而且它们因为正等待对方拥有的资源而不能提交或回滚事务。例如,运行事务 1 的线程 T1 具有 Supplier 表上的排它锁。运行事务 2 的线程 T2 具有 Part 表上的排它锁,并且之后需要 Supplier 表上的锁。事务 2 无法获得这一锁,因为事务 1 已拥有它。事务 2 被阻塞,等待事务 1。然后,事务 1 需要 Part 表的锁,但无法获得锁,因为事务 2 将它锁定了。事务在提交或回滚之前不能释放持有的锁。因为事务需要对方控制的锁才能继续操作,所以它们不能提交或回滚。
      

  2.   

    举个例子:
       同样有一个资源:单人厕所。
       有一个人在厕所里待者,因为没有手纸,所以说出不来。
       另外一个人有手纸想去厕所,但是因为厕所有人站着,所以进不去。
    想出来的出不来,想进去的进不去。
       
    1、没有及时commit事务,及时交出控制权。
    2、减少热点,建两个厕所。
    3、减小事务,把事务尽可能的减小。