SQL之谈谈事务和锁(sql事务的作用)
wptr33 2025-05-09 22:06 28 浏览
【十】事务和锁
10.1 事务具备的四个属性(简称ACID属性):
1)原子性(Atomicity):事务是一个完整的操作,事务的各步操作是不可分的(如原子不可分),操作要么都执行了,要么都不执行。
2)一致性(Consistency):事务执行的结果必须使数据库从一个一致的状态到另一个一致的状态。
3)隔离性(Isolation):事务的执行不干扰其他事务,一般来说数据库的隔离性都提供了不同程度的隔离级别。
4)持久性(Durability):事务一旦提交完成后,数据库就不可以丢失这个事务的结果,数据库通过日志能够保持事务的持久性。
10.2 事务的隔离级别:
10.2.1事务可能出现的三种隔离问题:
1.脏读:
脏读是指在一个事务中读到了另一个事务未提交的记录。
2.不可重复读:
在一个事务还没有结束时,读到了另一个事务更改(update)的并提交的记录,两次重复读到同一记录的不同值。
3.幻读:
在一个事务还没有结束时,读到了另一个事务更改(insert)的并提交的记录,第二次读到了新的记录,发生了幻觉一样。
10.2.2采用SQL标准中的四个隔离级别,可以针对性的解决脏读、不可重复读、幻读这三类问题。
10.3 事务的开始和结束:
10.3.1 事务采用隐性的方式
1)起始于session的第一条DML语句;
2)一个session某个时刻只能有一个事务。
10.3.2 事务结束的方式:
1)用户退出SQLPLUS(正常退出是提交,非正常退出是回滚);
2)服务器故障或系统崩溃(回滚);
3)shutdowm immediate(回滚)。
在一个事务里如果某个DML语句失败,之前其他任何DML语句将保持完好,且不会提交!
4)在事务所在的会话中做非DML操作,比如做DDL操作,默认的是提交。
10.4 Oracle的事务保存点功能:
savepoint命令允许在事务进行中设置一个标记(保存点),回滚到这个标记可以保留该点之前的事务存在,并使事务继续执行。
实验:
savepoint sp1;
delete from emp1 where empno=7900;
savepoint sp2;
update emp1 set ename='timran' where empno=7788;
select * from emp1;
rollback to sp2;
select * from emp1;
rollback to sp1;
注意rollback to XXX 后,XXX左侧的事务不会结束。
10.5 SCN的概念
10.5.1概念:
SCN全称是System Change Number,它是一个不断增长的整数,相当于Oracle内部的一个时钟,只要数据库一有变更,这个SCN就会增加,Oracle通过SCN记录数据库里事务的一致性。
SCN涉及了实例恢复和介质恢复的核心概念,它几乎无处不在:控制文件,数据文件,日志文件都有SCN,包括block上也有SCN。
10.5.2理解多版本读一致性
实际上,我们所说的保证同一时间点一致性读的概念,其背后是物理层面的block读,Oracle会依据你发出select命令,记录下那一刻的SCN值,然后以这个SCN值去同所读的每个block上的SCN比较,如果读到的块上的SCN大于select发出时记录的SCN,则需要利用Undo得到该block的前镜像,在内存中构造CR块(Consistent Read)。
10.5.3获得当前SCN的两个办法:
SQL> select current_scn from v$database;
SQL> select dbms_flashback.get_system_change_number from dual;
有两个函数可以实现SCN和TIMESTAMP之间的互转:
scn_to_timestamp / timestamp_to_scn
SQL> select scn_to_timestamp(current_scn) from v$database;
10.6 共享锁与排他锁的基本原理:
10.6.1 基本原则
排他锁:排斥其他的排他锁和共享锁;
共享锁:排斥其他的排他锁,不排斥其他的共享锁。
10.6.2 Oracle锁的种类
因为有事务才有锁的概念,Oracle数据库锁可以分为以下几大类:
DML锁(data locks,数据锁),用于保护数据的完整性;
DDL锁(dictionary locks,数据字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;
SYSTEM锁(internal locks and latches),保护数据库的内部结构。
我们探讨Oracle的DML操作(insert、update、delete),它包括两种锁:TX(行锁)和TM(表锁)。
TX 是面向事务的行锁,它表示你锁定了表中的一行或若干行,update和delete操作都会产生行锁,insert操作除外。
TM 是面向对象的表锁,它表示你锁定了系统中的一个对象,在锁定期间不允许其他会话对这个对象做DDL操作。否则会报“ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效”。(ddl_lock_timeout参数可以延迟一段时间再该报错)。
行锁(TX)只有一种,表锁(TM)共有五种:分别是 RS, RX, S, SRX, X。对于DML操作,Oracle会自动加表级锁(即TM中的RX锁)和行锁(即TX锁)。
10.7 五种TM表锁的含义:
1)ROW SHARE 行共享 (RS)
允许其他用户同时更新其他行,允许其他用户同时加共享锁,不允许有独占(排他性质)的锁
2)ROW EXCLUSIVE 行排他 (RX)
允许其他用户同时更新其他行,只允许其他用户同时加行共享锁或者行排他锁
3)SHARE 共享 (S)
不允许其他用户同时更新任何行,只允许其他用户同时加共享锁或者行共享锁
4)SHARE ROW EXCLUSIVE共享行排他 (SRX)
不允许其他用户同时更新其他行,只允许其他用户同时加行共享锁
5)EXCLUSIVE排他 (X)
其他用户禁止更新任何行,禁止其他用户同时加任何排他锁。
10.8 加锁模式:
第一种方式:自动加锁
做DML操作时,如insert,update,delete,以及select....for update由oracle自动完成加锁
Session1/scott:
SQL> select * from dept1 where deptno=30 for update;
用for update加锁
Session2/sys:
SQL>select * from scott.dept1 for update;
不试探,被锁住
SSession2/sys:
SQL>select * from scott.dept1 for update nowait;
试探,以防被锁住
SQL>select * from scott.dept1 for update wait 5;
SQL> select * from scott.dept1 for update skip locked;
跳过加锁的记录,锁定其他记录
1)对整个表for update 是不锁insert语句的。
2)wait 5:等5秒自动退出;
nowait:不等待;
skip locked:跳过。
三个都可起到防止自己被挂起的作用。
【语法】:lock table 表名 in exclusive mode。(一般限于后三种表锁)
10.9 死锁和解锁:
Oracle自动侦测死锁,自动解决锁争用。
制作死锁案例:
session1
update scott.emp1 set sal=8000 where empno=7369;
session2
update scott.emp1 set sal=9000 where empno=7934;
session1
update scott.emp1 set sal=8000 where empno=7934;
session2
update scott.emp1 set sal=9000 where empno=7369;
报错:ORA-00060: 等待资源时检测到死锁
10.10 管理员如何解锁:
可以根据以下方法准确定位要kill session的sid号和serial#号:
SQL> select * from v$lock where type in ('TX','TM');
SQL> select a.sid,a.serial#,b.sql_text from v$session a,v$sql b where a.prev_sql_id=b.sql_id and a.sid=127;
SID SERIAL# SQL_TEXT
---------- ---------- --------------------------------------------------------------------------------
127 2449 update emp1 set sal=8000 where empno=7788
SQL> select sid,serial#,blocking_session,username,event from v$session where blocking_session_status='VALID';
SID SERIAL# BLOCKING_SESSION USERNAME EVENT
---------- ---------- ---------------- ------------------------------ ----------------------------------------
127 2449 134 SCOTT enq: TX - row lock contention
也可以根据v$lock视图的block 和request确定session阻塞关系,确定无误后再杀掉这个session
SQL>ALTER SYSTEM KILL SESSION '127,2449';
更详细的信息,可以从多个视图得出,相关的视图有:v$session, v$process, v$sql, v$locked, v$sqlarea等等…
阻塞(排队)从EM里看的更清楚 EM-->Performance-->Additional Monitoring Links-->Blocking Sessions(或Instance Locks)。
the end !!!
@jackman 共筑美好!
相关推荐
- redis的八种使用场景
-
前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...
- 基于Redis的3种分布式ID生成策略
-
在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...
- 基于OpenWrt系统路由器的模式切换与网页设计
-
摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...
- 这篇文章教你看明白 nginx-ingress 控制器
-
主机nginx一般nginx做主机反向代理(网关)有以下配置...
- 如何用redis实现注册中心
-
一句话总结使用Redis实现注册中心:服务注册...
- 爱可可老师24小时热门分享(2020.5.10)
-
No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...
- Apportable:拯救程序员,IOS一秒变安卓
-
摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...
- JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透
-
以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...
- 3月26日更新 快速施法自动施法可独立设置
-
2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...
- Redis 是如何提供服务的
-
在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...
- lua _G、_VERSION使用
-
到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...
- China's top diplomat to chair third China-Pacific Island countries foreign ministers' meeting
-
BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...
- 移动工作交流工具Lua推出Insights数据分析产品
-
Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...
- Redis 7新武器:用Redis Stack实现向量搜索的极限压测
-
当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...
- Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求
-
重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)