什么是数据库锁定与死锁

锁定(Locking)发生在当一个事务获得对某一资源的“锁”时,这时,其他的事务就不能更改这个资源了,这种机制的存在是为了保证数据一致性;在设计与数据库交互的程序时,必须处理锁与资源不可用的情况。锁定是个比较复杂的概念,仔细说起来可能又需要一大篇,所以在本文中,只把锁定看作是一个临时事件,这意味着如果一个资源被锁定,它总会在以后某个时间被释放。

而死锁发生在当多个进程访问同一数据库时,其中每个进程拥有的锁都是其他进程所需的,由此造成每个进程都无法继续下去。

如何避免锁

我们可利用事务型数据库中的隔离级别机制来避免锁的创建,正确地使用隔离级别可使程序处理更多的并发事件(如允许多个用户访问数据),还能预防像丢失修改(Lost Update)、读“脏”数据(Dirty Read)、不可重复读(Nonrepeatable Read)及“虚”(Phantom)等问题。

表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、 有一个正确的提交策略。确保程序不再使用资源时就立即释放它。

如何处理死锁与超时

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

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

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

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

全部

java操作数据库挂死_如何在Java程序中处理数据库超时与死?相关推荐

  1. jsp在mysql中删除数据_如何在jsp页面中删除数据库中的数据

    如何在jsp页面中删除数据库中的数据 各位大虾! 我想在jsp页面上写一个按钮功能,从而动态的删除数据库中的一行数据. 不知道怎么实现 这是我写的一段代码 数据库是MySql UserBean p3= ...

  2. java 合并两个列表_如何在Java中合并两个列表?

    java 合并两个列表 Merging two lists in Java is often a useful operation. These lists can be ArrayLists or ...

  3. java pdf添加透明水印_如何在PDF文件中添加透明水印

    原标题:如何在PDF文件中添加透明水印 有些文件添加水印,但是又不想水印影响文件的使用有时候会设置透明水印,那么PDF怎么设置透明水印呢,应该有很多的小伙伴们都很好奇应该怎么做吧,接下来就为大家分享一 ...

  4. java 查找链表中间元素_如何在Java中一次性查找Java中链表的中间元素

    如何在一次传递中找到LinkedList的中间元素?这是一个 Java 和非Java程序员面试时经常被问到的编程问题.这个问题类似于检查回文或计算阶乘,有时也会要求编写代码.为了回答这个问题,候选人必 ...

  5. java字符串字符排列组合_如何在Java中查找字符串的所有排列

    java字符串字符排列组合 In this tutorial, we will learn how to find the permutation of a String in a Java Prog ...

  6. java类添加单元测试代码_如何在java中单元测试时跳过一段代码

    如果问题确实是: 如何在Java 然后我给出的答案同意单元测试时,我跳过一段代码.依赖注入,嘲讽框架绝对是真正的单元测试的正确途径. 但是,如果问题是: 使用JUnit(或其他单元测试框架) 然后我想 ...

  7. java如何使用水晶报表_在Windows应用程序中使用水晶报表的方法

    在Windows应用程序中使用水晶报表的方法 举例说明: (1)创建一个Windows应用程序,选择[解决方案资源管理器] à[添加新项]à[crystal report],输入报表名Reportl. ...

  8. plsql怎么批量添加数据_如何在PLSQL程序中处理批量数据

    如何在 plsql 程序处理批量数据 . Author: Wenxing.zhong Date: 2008-05-29 在 ebao 的应用程序中,有很多的业务需要通过 pl/sql 程序来处理,每天 ...

  9. 在java读字符串入文件_如何在java中将文件读入字符串?

    我已经将文件读入String. 该文件包含各种名称,每行一个名称. 现在的问题是我想在String数组中使用这些名称. 为此我写了以下代码: String [] names = fileString. ...

最新文章

  1. Google的面试题长啥样?看完被吊打!
  2. 好书推介---Windows Server 2003企业部署原理与实践
  3. 【转】在.Net中关于AOP的实现
  4. 前端学习(2245)vue值造轮子之需求设计
  5. ActiveX控件的另类免费签名法
  6. 【OpenCV 例程200篇】45. 图像的灰度直方图
  7. springboot-web进阶(三)——统一异常处理
  8. java检测栈溢出_java运行方法栈溢出
  9. Java中的break Label 和continue Label
  10. 每一个都能笑抽的39个奇葩代码注释
  11. Atitit.收银系统模块架构attilax 总结
  12. git 找到冲突_git怎么知道哪个文件冲突
  13. 软件开发入门【3分钟课程】
  14. The DELETE statement conflicted with the REFERENCE constraint
  15. 改变文字颜色html,html怎么改变字体大小和颜色
  16. 男人说这几句话代表他不想娶你
  17. 千道Java面试真题整理系列:MySQL灵魂五十问,在遇面试也不怕!
  18. 如何做好职业规划(乾卦)
  19. 网页卡顿是网站服务器,想解决网站卡顿情况就用这几种诀窍,进来看看
  20. 网络游戏外挂编写原理

热门文章

  1. 量化金融第一步获取市场数据 (Python Tushare)
  2. go 求两个时间相差的天数
  3. 更改idea控制台输出字体
  4. Hadoop权威指南 _03_第I部分Hadoop基础知识_第1章初识Hadoop.
  5. java小编程----反转字符串中的每一个单词
  6. leetcode 398. Random Pick Index | 398. 随机数索引(Java)
  7. 数据结构:试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来
  8. scala教程之:可见性规则
  9. strtus2改成springboot_springboot+struts2打成jar包运行
  10. 整车物流系统源代码_整车物流AGV智能搬运机器人一阶段实地测试顺利完成