在Java程序中处理数据库超时与死锁

 简介:每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况,而这些情况需要在代码中编程来解决,本文主要介绍与数据库事务死锁等情况相关的重试逻辑概念,此外,还会探讨如何避免死锁等问题,文章以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

  表1: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语句有歧义性,因此,锁可能就是造成其中资源问题的源头。

  另外,以下是一些可降低锁数目的建议:

  1、 将CURRENTDATA设为NO。这条命令告诉DB2模糊光标为只读。

  2、 在适当的时候,尽可能使用User Uncommitted Read(用户未提交的读)。

  3、 尽可能关闭所有光标。

  4、 有一个正确的提交策略。确保程序不再使用资源时就立即释放它。

#p#

  如何处理死锁与超时

  在程序中使用重试逻辑,可处理以下三种SQL错误代码:

  1、 904:返回这个代码表示一条SQL语句是因为已达到资源限度而结束的。程序中可提交或回滚更改,并执行重试逻辑。

  2、 911:程序收到这个SQL代码,表示因为没有为锁列表分配足够的内存,现在已达到数据库的最大锁数目。

  3、 912:程序收到这个SQL代码,表示死锁或超时,依照904中的方法来解决。

  以下是一段Java代码,其捕捉返回的-911、-912、-904代码,并进行重试:

  for (int i = 0; i < MAX_RETRY_ATTEMPTS; i++) {

  //以下代码模拟一次事务

  try {

  stmt = conn.createStatement();

  System.out.println(“Transaction started…”);

  stmt.executeUpdate(“UPDATE 1…”); //SQL语句1

  stmt.executeUpdate(“UPDATE 2…”); // SQL语句2

  stmt.executeUpdate(“UPDATE 3…”); // SQL语句3

  stmt.executeUpdate(“UPDATE 3…”); // SQL语句4

  //提交所有更改

  conn.commit();

  System.out.println(“事务已完成。”);

  //确保只运行了一次。

  i = MAX_RETRY_ATTEMPTS;

  } catch (SQLException e) {

  /**

  *如果返回的SQL代码为-911,回滚会自动完成,程序回滚至前一次的提交状态。

  *程序将进行重试。

  */

  if (-911 == e.getErrorCode()) {

  //等待RETRY_WAIT_TIME

  try {

  Thread.sleep(RETRY_WAIT_TIME);

  } catch (InterruptedException e1) {

  //即使休眠被打断,但仍要重试。

  System.out.println(“休眠被打断。”);

  }

  }

  /**

  *如果返回的SQL代码为-912,表示死锁及超时。

  *如果是-904,代表已达到资源限度。

  *在这种情况下,程序将回滚并进行重试。

  */

  else if (-912 == e.getErrorCode() || -904 == e.getErrorCode()) {

  try {

  //需要回滚

  conn.rollback();

  } catch (SQLException e1) {

  System.out.println(“无法回滚。”; color:black’> + e);

  }

  try {

  //等待RETRY_WAIT_TIME

  Thread.sleep(RETRY_WAIT_TIME);

  } catch (InterruptedException e1) {

  //即使休眠被打断,但仍要重试。

  System.out.println(“休眠被打断。” + e1);

  }

  } else {

  //如果是其他错误,就不进行重试。

  i = MAX_RETRY_ATTEMPTS;

  System.out.println(“有错误发生,错误代码:”

  + e.getErrorCode() + ” SQL状态:”

  + e.getSQLState() + “其他信息:” + e.getMessage());

  }

  从上面也可看到,程序对死锁、超时、最大锁数目将会进行MAX_RETRY_ATTEMPTS次重试;其次,当“最大锁数目”的情况发生时(-911),程序不必手工进行回滚,因为此时的回滚是自动完成的;最后,无论何时返回-911、-904、-912代码,程序应在下次重试前等待RETRY_WAIT_TIME一段时间。
 

       以上就是我要为大家介绍的全部内容,这些内容都是很实用的哦,掌握了这些在应对超时和死锁的问题时,您就能轻松应对啦,还等什么,赶快来学习吧。

【编辑推荐】

  1. java数据库设计中的14个技巧
  2. Java技巧:Java连接数据库技巧全攻略
  3. Java访问ACCESS数据库的方法

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/273076.html<

赞 (0)
管理的头像管理
上一篇2025-05-09 02:41
下一篇 2025-05-09 02:42

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注