oracle数据库的表什么情况下会被锁住

oracle数据库的表什么情况下会被锁住,第1张

DML锁又可以分为,行锁、表锁、死锁
-行锁:当事务执行数据库插入、更新、删除 *** 作时,该事务自动获得 *** 作表中 *** 作行的排它锁。
-表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用LOCK TABLE语句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用LOCK TABLE显示的定义一个表级的共享锁(LOCK TABLE具体用法请参考相关文档)。
-死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就出现死锁。
如事务1在表A行记录#3中有一排它锁,并等待事务2在表A中记录#4中排它锁的释放,而事务2在表A记录行#4中有一排它锁,并等待事务1在表A中记录#3中排它锁的释放,事务1与事务2彼此等待,因此就造成了死锁。死锁一般是因拙劣的事务设计而产生。
死锁只能使用SQL下:alter system kill session "sid,serial#";或者使用相关 *** 作系统kill进程的命令,如UNIX下kill -9 sid,或者使用其它工具杀掉死锁进程。
+DDL锁又可以分为:排它DDL锁、共享DDL锁、分析锁
-排它DDL锁:创建、修改、删除一个数据库对象的DDL语句获得 *** 作对象的 排它锁。如使用alter table语句时,为了维护数据的完成性、一致性、合法性,该事务获得一排它DDL锁。
-共享DDL锁:需在数据库对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁。
如创建一个包,该包中的过程与函数引用了不同的数据库表,当编译此包时,该事务就获得了引用表的共享DDL锁。
-分析锁:ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使运行相同语句的应用速度更快。一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特的DDL锁类型,ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。当一个事务修改或删除了共享池持有分析锁的数据库对象时,ORACLE使共享池中的对象作废,下次在引用这条SQL/PLSQL语句时,ORACLE重新分析编译此语句。

行锁的等待

在介绍如何解决行锁等待问题前,先简单介绍下这类问题产生的原因。产生原因简述:当多个事务同时去 *** 作(增删改)某一行数据的时候,MySQL 为了维护 ACID 特性,就会用锁的形式来防止多个事务同时 *** 作某一行数据,避免数据不一致。只有分配到行锁的事务才有权力 *** 作该数据行,直到该事务结束,才释放行锁,而其他没有分配到行锁的事务就会产生行锁等待。如果等待时间超过了配置值(也就是 innodb_lock_wait_timeout 参数的值,个人习惯配置成 5s,MySQL 官方默认为 50s),则会抛出行锁等待超时错误。

如上图所示,事务 A 与事务 B 同时会去 Insert 一条主键值为 1 的数据,由于事务 A 首先获取了主键值为 1 的行锁,导致事务 B 因无法获取行锁而产生等待,等到事务 A 提交后,事务 B 才获取该行锁,完成提交。这里强调的是行锁的概念,虽然事务 B 重复插入了主键,但是在获取行锁之前,事务一直是处于行锁等待的状态,只有获取行锁后,才会报主键冲突的错误。当然这种 Insert 行锁冲突的问题比较少见,只有在大量并发插入场景下才会出现,项目上真正常见的是 update&delete 之间行锁等待,这里只是用于示例,原理都是相同的。

三、产生的原因根据我之前接触到的此类问题,大致可以分为以下几种原因

1 数据库表锁定原理

11 目前的C/S,B/S结构都是多用户访问数据库,每个时间点会有成千上万个user来访问DB,其中也会同时存取同一份数据,会造成数据的不一致性或者读脏数据

12 事务的ACID原则

13 锁是关系数据库很重要的一部分, 数据库必须有锁的机制来确保数据的完整和一致性

131 SQL Server中可以锁定的资源:

132 锁的粒度:

133 锁的升级:

锁的升级门限以及锁升级是由系统自动来确定的,不需要用户设置

134 锁的类型:

(1) 共享锁:

共享锁用于所有的只读数据 *** 作

(2) 修改锁:

修改锁在修改 *** 作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象

(3) 独占锁:

独占锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。独占锁不能和其他锁兼容。

(4) 架构锁

结构锁分为结构修改锁(Sch-M)和结构稳定锁(Sch-S)。执行表定义语言 *** 作时,SQL Server采用Sch-M锁,编译查询时,SQL Server采用Sch-S锁。

(5) 意向锁

意向锁说明SQL Server有在资源的低层获得共享锁或独占锁的意向。

(6) 批量修改锁

批量复制数据时使用批量修改锁

134 SQL Server锁类型

(1) HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁。

(2) NOLOCK:不添加共享锁和排它锁,当这个选项生效后,可能读到未提交读的数据或“脏数据”,这个选项仅仅应用于SELECT语句。

(3) PAGLOCK:指定添加页锁(否则通常可能添加表锁)。 

(4) READCOMMITTED用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上 *** 作。

(5) READPAST: 跳过已经加锁的数据行,这个选项将使事务读取数据时跳过那些已经被其他事务锁定的数据行,而不是阻塞直到其他事务释放锁,

READPAST仅仅应用于READ COMMITTED隔离性级别下事务 *** 作中的SELECT语句 *** 作。 

(6) READUNCOMMITTED:等同于NOLOCK。 

(7) REPEATABLEREAD:设置事务为可重复读隔离性级别。 

(8) ROWLOCK:使用行级锁,而不使用粒度更粗的页级锁和表级锁。

(9) SERIALIZABLE:用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。 

(10) TABLOCK:指定使用表级锁,而不是使用行级或页面级的锁,SQL Server在该语句执行完后释放这个锁,而如果同时指定了HOLDLOCK,该锁一直保持到这个事务结束。 (11) TABLOCKX:指定在表上使用排它锁,这个锁可以阻止其他事务读或更新这个表的数据,直到这个语句或整个事务结束。 

(12) UPDLOCK :指定在
读表中数据时设置更新 锁(update lock)而不是设置共享锁,该锁一直保持到这个语句或整个事务结束,使用UPDLOCK的作用是允许用户先读取数据(而且不阻塞其他用户读数据),并且保证在后来再更新数据时,这一段时间内这些数据没有被其他用户修改。

2 如何解除表的锁定,解锁就是要终止锁定的那个链接,或者等待该链接事务释放

21 Activity Monitor

可以通过Wait Type, Blocked By栏位查看到,SPID 54 被SPID 53 阻塞 可以右键Details查到详细的SQL 语句,或Kill掉这个进程

22 SQL Server提供几个DMV,查看locks

sysdm_exec_requests
sysdm_tran_locks
sysdm_os_waiting_tasks
sysdm_tran_database_transactions

(1)

select  from sysdm_tran_locks where  resource_type<>'DATABASE' --and resource_database_id=DB_ID()

(2)

SELECT session_id, blocking_session_id,
FROM sysdm_exec_requests
WHERE blocking_session_id > 0

(3)代码

SELECT
request_session_id as Spid,
Coalesce(sname + '' + oname + isnull('' + iname,''),
s2name + '' + o2name,
dbname) AS Object,
lresource_type as Type,
request_mode as Mode,
request_status as Status
FROM sysdm_tran_locks l
LEFT JOIN syspartitions p
ON lresource_associated_entity_id = phobt_id
LEFT JOIN sysindexes i
ON pobject_id = iobject_id
AND pindex_id = iindex_id
LEFT JOIN sysobjects o
ON pobject_id = oobject_id
LEFT JOIN sysschemas s
ON oschema_id = sschema_id
LEFT JOIN sysobjects o2
ON lresource_associated_entity_id = o2object_id
LEFT JOIN sysschemas s2
ON o2schema_id = s2schema_id
LEFT JOIN sysdatabases db
ON lresource_database_id = dbdatabase_id
WHERE resource_database_id = DB_ID()
ORDER BY Spid, Object, CASE lresource_type
When 'database' Then 1
when 'object' then 2
when 'page' then 3
when 'key' then 4
Else 5 end

第一步,创建数据库表writer和查看表结构,利用SQL语句:
create table writer(
wid int(10),
wno int(10),
wname varchar(20),
wsex varchar(2),
wage int(2)
第二步,向数据库表writer插入五条数据,插入后查看表里数据
第三步,利用锁定语句锁定数据库表writer,利用SQL语句:
lock table writer read;
让数据库表只读不能进行写
第四步,为了验证锁定效果,可以查看数据库表数据,利用SQL语句:
select from writer;
第五步,利用update语句对id=5进行更新,SQL语句为:
update writer set wname = '胡思思' where id = 5;
第六步,利用unlock进行解锁,SQL语句为:
unlock tables;

12 事务的ACID原则
13 锁是关系数据库很重要的一部分, 数据库必须有锁的机制来确保数据的完整和一致性 131 SQL Server中可以锁定的资源:
132 锁的粒度:
133 锁的升级: 锁的升级门限以及锁升级是由系统自动来确定的,不需要用户设置 134 锁的类型: (1) 共享锁: 共享锁用于所有的只读数据 *** 作 (2) 修改锁: 修改锁在修改 *** 作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象 (3) 独占锁: 独占锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。独占锁不能和其他锁兼容。 (4) 架构锁 结构锁分为结构修改锁(Sch-M)和结构稳定锁(Sch-S)。执行表定义语言 *** 作时,SQL Server采用Sch-M锁,编译查询时,SQL Server采用Sch-S锁。 (5) 意向锁 意向锁说明SQL Server有在资源的低层获得共享锁或独占锁的意向。 (6) 批量修改锁 批量复制数据时使用批量修改锁 134 SQL Server锁类型 (1) HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁。 (2) NOLOCK:不添加共享锁和排它锁,当这个选项生效后,可能读到未提交读的数据或“脏数据”,这个选项仅仅应用于SELECT语句。 (3) PAGLOCK:指定添加页锁(否则通常可能添加表锁)。 (4) READCOMMITTED用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上 *** 作。 (5) READPAST: 跳过已经加锁的数据行,这个选项将使事务读取数据时跳过那些已经被其他事务锁定的数据行,而不是阻塞直到其他事务释放锁, READPAST仅仅应用于READ COMMITTED隔离性级别下事务 *** 作中的SELECT语句 *** 作。 (6) READUNCOMMITTED:等同于NOLOCK。 (7) REPEATABLEREAD:设置事务为可重复读隔离性级别。 (8) ROWLOCK:使用行级锁,而不使用粒度更粗的页级锁和表级锁。

详细步骤如下:

1、点击新建查询按钮,打开SQL命令编辑框,对数据库表的 *** 作以及维护都可以通过编辑SQL命令实现。

2、在编辑框内编辑创建数据库表的代码,确认代码无误后,单击执行按钮,创建数据表。

3、创建数据表的源代码如下:

use test go

if exists(select name from systables where name='Student')

drop table Student go

create table Student

(sname nchar(10) primary key,

sex nchar(2) not null,

bir datetime)

数据库管理系统,database management system,简称dbms,是一种 *** 纵和管理数据库的大型软件,用于建立、使用和维护数据库。用户通过dbms访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。

提供数据定义语言(ddl)。用它书写的数据库模式被翻译为内部表示。数据库的逻辑结构、完整性约束和物理储,存结构保存在内部的数据字典中。数据库的各种数据 *** 作(如查找、修改、插入和删除等)和数据库的维护管理都是以数据库模式为依据的。

对于写锁定如下:
1)、如果表没有加锁,那么对其加写锁定。
2)、否则,那么把请求放入写锁队列中。
对于读锁定如下:
1)、如果表没有加写锁,那么加一个读锁。
2)、否则,那么把请求放到读锁队列中。
当然我们可以分别用low_priority 以及high_priority在写和读 *** 作上来改变这些行为。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13339777.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-17
下一篇 2023-07-17

发表评论

登录后才能评论

评论列表(0条)

保存