VisualBasic辅导:在Java程序中处理数据库超时与死锁

2026-03-23
简介
  每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况,而这些情况需要在代码中编程来解决;本文主要介绍与数据库事务死锁等情况相关的重试逻辑概念,此外,还会探讨如何避免死锁等问题,文章以DB2(版本9)与Java为例进行讲解。
  什么是数据库锁定与死锁
  锁定(Locking)发生在当一个事务获得对某一资源的“锁”时,这时,其他的事务就不能更改这个资源了,这种机制的存在是为了保证数据一致性;在设计与数据库交互的程序时,必须处理锁与资源不可用的情况。锁定是个比较复杂的概念,仔细说起来可能又需要一大篇,所以在本文中,只把锁定看作是一个临时事件,这意味着如果一个资源被锁定,它总会在以后某个时间被释放。而死锁发生在当多个进程访问同一数据库时,其中每个进程拥有的锁都是其他进程所需的,由此造成每个进程都无法继续下去。
  如何避免锁
  我们可利用事务型数据库中的隔离级别机制来避免锁的创建,正确地使用隔离级别可使程序处理更多的并发事件(如允许多个用户访问数据),还能预防像丢失修改(Lost Update)、读“脏”数据(Dirty Read)、不可重复读(Nonrepeatable Read)及“虚”(Phantom)等问题。
  隔离级别 问题现象
  丢失修改 读“脏”数据 不可重复读 “虚”
  可重复读取 No No No No
  读取稳定性 No No No Yes
  光标稳定性 No No Yes Yes
  未提交的读 No Yes Yes Yes
  表DB2的隔离级别与其对应的问题现象
  在只读模式中,就可以防止锁定发生,而不用那些未提交只读隔离级别的含糊语句。一条SQL语句当使用了下列命令之一时,就应该考虑只读模式了:
  1、JOIN
  2、SELECT DISTINCT
  3、GROUP BY
  4、ORDER BY
  5、UNION
  6、UNION ALL
  7、SELECT
  8、FOR FETCH ONLY (FOR READ ONLY)
  9、SELECT FROM
  如果包含上述任一命令,可以说你的SQL语句有歧义性,因此,锁可能就是造成其中资源问题的源头。