北大青鸟java培训:在Java程序中处理数据库超时与死锁?每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况,而这些情况需要在代码中编程来解决;本文主要介绍与数据库事务死锁等情况相关的重试逻辑概念,此外,还会探讨如何避免死锁等问题,文章以DB2(版本9)与为例进行讲解 。
什么是数据库锁定与死锁锁定(Locking)发生在当一个事务获得对某一资源的“锁”时,这时,其他的事务就不能更改这个资源了,这种机制的存在是为了保证数据一致性;在设计与数据库交互的程序时,必须处理锁与资源不可用的情况 。
锁定是个比较复杂的概念 , 仔细说起来可能又需要一大篇,所以在本文中,只把锁定看作是一个临时事件,这意味着如果一个资源被锁定,它总会在以后某个时间被释放 。
而死锁发生在当多个进程访问同一数据库时 , 其中每个进程拥有的锁都是其他进程所需的 , 由此造成每个进程都无法继续下去 。
如何避免锁我们可利用事务型数据库中的隔离级别机制来避免锁的创建,正确地使用隔离级别可使程序处理更多的并发事件(如允许多个用户访问数据) , 还能预防像丢失修改(LostUpdate)、读“脏”数据(DirtyRead)、不可重复读(NonrepeatableRead)及“虚”(Phantom)等问题 。
隔离级别问题现象丢失修改读“脏”数据不可重复读“虚”可重复读取NoNoNoNo读取稳定性NoNoNoYes光标稳定性NoNoYesYes未提交的读NoYesYesYes表1:DB2的隔离级别与其对应的问题现象在只读模式中,就可以防止锁定发生,而不用那些未提交只读隔离级别的含糊语句 。
浙江电脑培训发现一条SQL语句当使用了下列命令之一时,就应该考虑只读模式了
java 死锁死锁
死锁是这样一种情形:多个线程同时被阻塞简单的java代码死锁,它们中简单的java代码死锁的一个或者全部都在等待某个资源被释放 。由于线程被无限期地阻塞 , 因此程序不可能正常终止 。
导致死锁简单的java代码死锁的根源在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问 。“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此 , 被允许执行的线程首先必须拥有对变量或对象的排简单的java代码死锁他性的访问权 。当线程访问对象时 , 线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁 。
由于这个原因,在使用“synchronized”关键词时,很容易出现两个线程互相等待对方做出某个动作的情形 。代码一是一个导致死锁的简单例子 。
//代码一
class Deadlocker {
int field_1;
private Object lock_1 = new int[1];
int field_2;
private Object lock_2 = new int[1];
public void method1(int value) {
“synchronized” (lock_1) {
“synchronized” (lock_2) {
field_1 = 0; field_2 = 0;
}
}
}
public void method2(int value) {
“synchronized” (lock_2) {
“synchronized” (lock_1) {
field_1 = 0; field_2 = 0;
}
}
}
}
参考代码一,考虑下面的过程:
◆ 一个线程(ThreadA)调用method1() 。
◆ ThreadA在lock_1上同步,但允许被抢先执行 。
◆ 另一个线程(ThreadB)开始执行 。
◆ ThreadB调用method2() 。
◆ ThreadB获得lock_2 , 继续执行,企图获得lock_1 。但ThreadB不能获得lock_1,因为ThreadA占有lock_1 。
◆ 现在,ThreadB阻塞,因为它在等待ThreadA释放lock_1 。
◆ 现在轮到ThreadA继续执行 。ThreadA试图获得lock_2,但不能成功,因为lock_2已经被ThreadB占有简单的java代码死锁了 。
推荐阅读
- 手机直播视频素材,手机直播模板
- 马云谈如何做电商销售,马云电商成功的故事
- editor.mdwordpress的简单介绍
- python编程零基础学习,python编程从入门到精通
- Java开机自启动代码 java开机自启动代码怎么写
- 电脑网页版怎么查看图片,如何在电脑上看图片的预览
- vb.net的安装,vbnet ini
- 快手直播多平台分发,快手主播分成怎么分
- xslt调用java代码的简单介绍