`

数据库锁表原因

 
阅读更多
 

在联机事务处理(OLTP)的数据库应用系统中,多用户、多任务的并发性是系统最重要的技术指标之一。为了提高并发性,目前大部分RDBMS都采用加锁技术。然而由于现实环境的复杂性,使用加锁技术又不可避免地产生了死锁问题。因此如何合理有效地使用加锁技术,最小化死锁是开发联机事务处理系统的关键。           
死锁产生的原因           
    在联机事务处理系统中,造成死机主要有两方面原因。一方面,由于多用户、多任务的并发性和事务的完整性要求,当多个事务处理对多个资源同时访问时,若双方已锁定一部分资源但也都需要对方已锁定的资源时,无法在有限的时间内完全获得所需的资源,就会处于无限的等待状态,从而造成其对资源需求的死锁。           
    另一方面,数据库本身加锁机制的实现方法不同,各数据库系统也会产生其特殊的死锁情况。如在Sybase       SQL Server 11中,最小锁为2K一页的加锁方法,而非行级锁。如果某张表的记录数少且记录的长度较短(即记录密度高,如应用系统中的系统配置表或系统参数表就属于此类表),被访问的频率高,就容易在该页上产生死锁。
         
容易发生死锁的几种情况如下:           
1>不同的存储过程、触发器、动态SQL语句段按照不同的顺序同时访问多张表;               
2>在交换期间添加记录频繁的表,但在该表上使用了非群集索引(non-clustered);               
3>表中的记录少,且单条记录较短,被访问的频率较高;           
4>整张表被访问的频率高(如代码对照表的查询等)。           

以上死锁情况的对应处理方法如下: 
       
1>在系统实现时应规定所有存储过程、触发器、动态SQL语句段中,对多张表的操作总是使用同一顺序。如:有两个存储过程proc1、proc2,都需要访问三张表zltab、z2tab和z3tab,如果proc1按照zltab、z2tab和z3tab的顺序进行访问,那么,proc2也应该按照以上顺序访问这三张表。           
2>对在交换期间添加记录频繁的表,使用群集索引(clustered),以减少多个用户添加记录到该表的最后一页上,在表尾产生热点,造成死锁。这类表多为往来账的流水表,其特点是在交换期间需要在表尾追加大量的记录,并且对已添加的记录不做或较少做删除操作。           
3>对单张表中记录数不太多,且在交换期间select或updata较频繁的表可使用设置每页最大行的办法,减少数据在表中存放的密度,模拟行级锁,减少在该表上死锁情况的发生。这类表多为信息繁杂且记录条数少的表。
           
如:系统配置表或系统参数表。在定义该表时添加如下语句:           
with   max_rows_per_page=1           
在存储过程、触发器、动态SQL语句段中,若对某些整张表select操作较频繁,则可能在该表上与其他访问该表的用户产生死锁。对于检查账号是否存在,但被检查的字段在检查期间不会被更新等非关键语句,可以采用在select命令中使用at       isolation       read       uncommitted子句的方法解决。该方法实际上降低了select语句对整张表的锁级别,提高了其他用户对该表操作的并发性。在系统高负荷运行时,该方法的效果尤为显著。           
如:           
select * from titles at isolation read uncommitted           
对流水号一类的顺序数生成器字段,可以先执行updata流水号字段+1,然后再执行select获取流水号的方法进行操作。

分享到:
评论

相关推荐

    数据库锁表问题解决方法

    当某个数据库用户在数据库中插入、更新、删除一个表的数据,或者增加一个表的主键时或者表的索引时,常常会出现ora-00054:resource busy and acquire with nowait specified这样的错误。 主要是因为有事务正在执行...

    oracle数据库用户频繁被锁原因排查

    oracle数据库用户为何频繁被锁,oracle数据库用户频繁被锁原因排查oracle数据库用户为何频繁被锁

    mysql数据库锁的产生原因及解决办法

    在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他

    解锁或者修改oracle 数据库用户密码.doc

    在 Oracle 数据库中,sys 和 system 用户是两个特殊的用户账户,它们拥有最高的权限,可以对数据库进行管理和维护。然而,如果这些用户账户被锁定,将无法以管理员身份登录系统。锁定的原因可能是由于密码输错次数...

    数据库,各种锁的概述

    A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读 A用户读取数据,随后B用户读出该数据并修改,此时A用户再...

    查询所有被锁的表找到被锁定的表,解锁

    1、查询所有被锁的表找到被锁定的表 2、解锁

    数据库里锁的基本概念

     A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致  不可重复读  A用户读取数据,随后B用户读出该数据并修改,...

    SQL Server数据库查询速度慢原因及优化方法

    【赛迪网-IT技术报道】SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:  1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)  2、I/O吞吐量小,形成了瓶颈效应。  3、没有...

    MYSQL锁表问题的解决方法

    本文实例讲述了MYSQL锁表问题的解决方法。分享给大家供大家参考,具体如下: 很多时候!一不小心就锁表!这里讲解决锁表终极方法! 案例一 mysql>show processlist; 参看sql语句 一般少的话 mysql>kill thread_...

    并发访问ORACLE数据库的数据死锁分析和解决措施.pdf

    Oracle数据库提供了两种锁机制:共享锁和排它锁。共享锁允许多个事务同时访问同一个资源,而排它锁则是事务独占资源。 Oracle数据库的锁机制可以避免数据不一致和数据丢失,但需要合理设计锁机制以避免数据死锁。 ...

    数据库 死锁的解决

    一个用户A 访问表A(锁住了表A),然后又访问表B 另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了 同样...

    27道高级开发数据库面试题目以及答案.pdf

    在表查询中,一律不要使用 * 作为查询的字段列表,原因是什么; 描述一下InnoDB和MyISAM的区别; 当前读和快照读的意义; 13 mvcc:多版本控制: 指的是一种提高并发的技术,其解决问题是什么; 14 MVCC实现过程; 14...

    数据库并发控制PPT学习教案.pptx

    封锁粒度是指对数据库中的某些资源加锁的粒度,可以是行级锁、页级锁、表级锁等。 在数据库并发控制中,还有一些其他概念,如活锁和死锁。活锁是指两个或多个事务循环等待对方释放资源,导致事务无法继续执行。死锁...

    DB2中查找被锁定的数据

    在应用中,我们经常会碰到sql执行很慢,但是数据库cpu和内存使用率又不高的情况,类似的问题基本上由于锁,排序等原因造成,本文主要描述如何去定位锁等待问题,谁在锁等待?等待谁持有的锁?锁在那个表?

    Oracle用户被锁的原因及解决办法

    在登陆时被告知test用户被...2、查看具体的被锁时间 SQL> select username,lock_date from dba_users where username='TEST'; USERNAME LOCK_DATE TEST 2009-03-10 08:51:03 3、解锁 SQL> alter user test account u

    数据库系统实现

    书中对数据库系统实现原理进行了深入阐述,并具体讨论了数据库管理系统的三个主要成分—存储管理器、查询处理器和事务管理器的实现技术。书中还对信息集成的最新技术,例如数据仓库、OLAP、数据挖掘、Mediator、数据...

    【《数据库与信息系统》复习题及答案】第5章数据库管理与保护.pdf

    A (A=200) ,随后事务 T1 由于某种原因被撤消,执⾏回滚,这时事务 T1 已修改过的变量 A 的数据恢复为原值 100;事务 T2 读到的变量 A 的数据 200 就与数据库中的数据不⼀致,称 为"脏"数据。 5.若事务 T 对数据 ...

    数据库管理规范.doc

    【强制】所有的MySQL数据库除历史原因外,都必须采用UTF8编码 【建议】一个表的某列与另一表有关联关系的时候, 请在应用程序维护外键关系,如果在数据库建立外键约束请遵循以下几点: 尽量少使用外键,在高并发下...

Global site tag (gtag.js) - Google Analytics