达梦数据库—锁

达梦数据库------封锁机制

锁的定义与作用

定义:通过数据库支持多用户并发 控制

作用:保持数据的一致性正确性

封锁机制

乐观锁、悲观锁是并发控制的核心思想

乐观锁

默认不会发生并发冲突,因此操作数据前不加锁 ,仅在提交事务时,通过 "版本校验" 判断数据是否被其他事务修改,若已修改则放弃操作并回滚,若未修改则提交。

悲观锁

默认会发生并发冲突,因此操作数据前,对数据加锁 ,强制独占访问,直到操作完成才释放锁,从根源上避免冲突。

悲观锁的模式分类
共享锁

share lock 简称s锁

定:用于读操作,事务可并发读取相同资源,不允许任何事务修改。

相关命令:

bash 复制代码
/*设置共享模式*/
LOCK TABLE staff in SHARE mode;
排他锁

exclusive lock 简称x锁

定:用于写操作,独占,不允许任何其他事务访问被封锁对象

相关命令:

sql 复制代码
/*设置排他模式*/
LOCK TABLE staff in EXCLUSIVE mode;
意向锁

用于读取与修改数据时使用,可同时对相同对象上锁

  • IS 意向共享锁:只读访问使用,可看可修(任意一边)
sql 复制代码
/*设置意向共享模式*/
LOCK TABLE staff in intent SHARE mode;
  • IX 意向排他锁:修改数据时使用,但是不能修改同一条数据(就是只有加ix锁的一边可修改)
sql 复制代码
/*设置意向排他模式*/
LOCK TABLE staff in intent EXCLUSIVE mode;

各个锁是否相容表

Y代表相容;X代表不相容

S X IS IX
S Y X Y X
X X X X X
IS Y X Y Y
IX X X Y X

根据封锁对象分类

TID对象(行锁):以事务号(ID)为封锁对象

对象锁:以对象ID为封锁对象

事务隔离级别

隔离级别:读提交、读未提交,可重复读、串行化

但在达梦数据中只有读提交、读未提交、串行化三种隔离级别

查看隔离级别:

sql 复制代码
select id,isolation from V$TRX;

注:isolation

0表示读未提交 1表示读提交 3表示串行化,可重复读

设置隔离级别为读提交

sql 复制代码
SET  TRANSACTION ISOLATION LEVEL READ COMMITTED;

设置隔离级别为读未提交

sql 复制代码
SET  TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

设置隔离级别为可重复读

sql 复制代码
SET  TRANSACTION ISOLATION LEVEL repeatable READ;

设置隔离级别为串行化

sql 复制代码
SET  TRANSACTION ISOLATION LEVEL SERIALIZABLE;

优点以及缺点

  • 读提交最大限度支持并发性能,发生无不可重复读与幻象读
  • 读未提交情况下,在此级别下,我啥都能发生,是最不严格的隔离级别,发生脏读
  • 串行化级别下,无不可重复读与幻象读现象,但并发能力弱喔

在事务隔离级别可发生以下现象

脏读

定:已经修改,但未提交的数据,另外一个事务可看到修改数据

不可重复读

为读提交

定:DM默认事务隔离级别,读取同一数据,两次读取数据不同

幻象读

为读提交

定:发现其他事务插入的新数据或者是删除的数据,一会有一会没有

扩展

死锁与活锁

活锁:可变

死锁:n个事务争夺n-1个进程或者更少,即锁死。

解决方法:杀进程

步骤:

  1. 看sql_text对应的id
bash 复制代码
       select * from v$sessions;
  1. 杀进程
bash 复制代码
		Sys.sp_close_sessoin(id);

涉及到的语句:

sql 复制代码
set SCHEMA sch_factory;

/*查看上下文*/
SELECT SYS_CONTEXT('userenv','current_schema');
/*查看数据库对象*/
SELECT * from DBA_OBJECTS WHERE OBJECT_NAME='STAFF';
/*查看锁 ltype  是对象锁*/
SELECT * from SYS.V$LOCK  WHERE TABLE_ID=1025; 
SELECT * from SYS.V$LOCK ;
SELECT * FROM STAFF;
/*设置共享模式*/
LOCK TABLE staff in SHARE mode;
/*设置排他模式*/
LOCK TABLE staff in EXCLUSIVE mode;
/*设置意向共享模式*/
LOCK TABLE staff in intent EXCLUSIVE mode;
/*事务ID,有id就有了*/
SELECT * from SYS.V$TRX;
/*作更新*/
UPDATE staff SET 年龄=40 where 职工号=3012;
/*设置隔离级别为读提交*/
SET  TRANSACTION ISOLATION LEVEL READ COMMITTED;
/*设置隔离级别为读未提交*/
SET  TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
/*查看隔离级别*/
select id,isolation from V$TRX;
/*试图在事务运行中,改变其属性-隔离级别rollback*/
rollback;
/*设置隔离级别为可重复读*/
SET  TRANSACTION ISOLATION LEVEL repeatable READ;
/*设置隔离级别为串行化*/
SET  TRANSACTION ISOLATION LEVEL SERIALIZABLE;
相关推荐
m0_6028577638 分钟前
如何提升SQL存储过程逻辑复用_封装通用存储过程函数
jvm·数据库·python
forEverPlume2 小时前
mysql如何实现高可用集群架构_基于MHA环境搭建与部署
jvm·数据库·python
草莓熊Lotso3 小时前
Vibe Coding 时代:LangChain 与 LangGraph 全链路解析
linux·运维·服务器·数据库·人工智能·mysql·langchain
zh1570238 小时前
JavaScript中WorkerThreads解决服务端计算瓶颈
jvm·数据库·python
代码AI弗森8 小时前
一文理清楚“算力申请 / 成本测算 / 并发评估”
java·服务器·数据库
摇滚侠9 小时前
expdp 查看帮助
java·数据库·oracle
流年似水~9 小时前
MCP协议实战:从零搭建一个让Claude能“看见“数据库的工具服务
数据库·人工智能·程序人生·ai·ai编程
2401_871492859 小时前
Vue.js监听器watch利用回调函数处理级联下拉框数据联动
jvm·数据库·python
志栋智能10 小时前
超自动化安全:构建智能安全运营的核心引擎
大数据·运维·服务器·数据库·安全·自动化·产品运营
zhoutongsheng11 小时前
C#怎么实现Swagger文档 C#如何在ASP.NET Core中集成Swagger自动生成API文档【框架】
jvm·数据库·python