博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
锁(学习笔记)
阅读量:4577 次
发布时间:2019-06-08

本文共 1317 字,大约阅读时间需要 4 分钟。

行级锁定和表级锁定:

行级锁定:

当用户执行了,INSERT,UPDATE,DELETE及SELECT FOR UPDATE语句时,

ORACLE将隐式的实现记录的锁定,如果事务没有提交,回滚,就一直在锁定状态,一直到事务提交后,才会将数据锁释放

表级锁定:

表级锁定需要用户明确的使用LOCK TABLE语句手工锁定

语法

LOCK TABLE 表名称|视图名称,表名称|视图名.... IN 锁定模式 MODE[NOWAIT]

NOWAIT这是一个可选项,当视图锁定一张表时,如果发现已经被其他事务锁定时,不会等待

锁:共享锁和排它锁.

锁分以下几种:

ROW SHARE 行共享锁

在锁定期间允许其他事务并发对表进行各种操作,但不允许任何事务对同一张表进行独占操作(禁止排它锁)

ROW EXCLUSIVE 行排它锁

允许用户进行任何操作,与行共享锁不同的是它不能防止其它事务对同一张表进行手工锁或者独占操作

SHARE 共享锁

其它事务只能执行是查询操作,不能修改操作

SHARE ROW EXCLUSIVE 共享排它锁

能许任何用户进行查询操作,但不允许其它用户使用共享锁

共享排它锁的常见应用

EXCLUSIVE:排它锁

事务将以独占方式锁定表,其它用户允许查度,但不能修改也不能设置任何的锁

 

死锁:

 

将事务自动提交关闭

 

SET AUTOCOMMIT=OFF 取消自动处理,开启事务处理

 

 

悲观锁:查询到数据后使用FOR UPDATE 将数据锁定

 

第一个会话执行

 

SELECT * FROM myemp WHERE deptno=10 FOR UPDATE;

第2个会话也执行

SELECT * FROM myemp WHERE deptno=10 FOR UPDATE;

发现第2个会话,一直在等待,不执行

第一个会话执行COMMIT或者ROLLBACK后,会话2才可以执行

乐观锁:把所有锁定都延迟到即将执行更新之前

使用UPDATE 表名 set 字段  WHERE 字段1=查询出的状态,AND字段2=查询出的状态

在第一个SESSION上针对emp表使用共享锁

LOCK TABLE emp IN SHARE MODE NOWAIT

第二个SESSION中删除emp全部数据

DELETE FROM emp;

因是共享锁,第二个SESSION应该只能查度不能修改,所以一直在等待

解锁:

 

管理员登录

 

查看数据库中的锁定

 

SELECT session_id,oracle_username,process FROM v$locked_object;

可以发现死锁的SESSION_ID;

查询V$session数据字典

SELECT sid,serial#,username,lockwait,status FROM v$session where sid IN(SESSION_ID);

可以查询到Serial#

通过

ALTER SYSTEM KILL SESSION'sid,serial#';

解除死锁

 

 

 

转载于:https://www.cnblogs.com/liunanjava/p/4211716.html

你可能感兴趣的文章
SelectQueryBuilder的用法
查看>>
android的用户定位(一)
查看>>
creat-react-app搭建的项目中按需引入antd以及配置Less和如何修改antd的主题色
查看>>
IIS安装
查看>>
html块级元素和行级元素的区别和使用
查看>>
for循环嵌套
查看>>
寒冬夜行人
查看>>
poj1151 Atlantis
查看>>
HTML页面之间的参数传递
查看>>
java面试题集锦
查看>>
scikit-learn:4.2.3. Text feature extraction
查看>>
Spring Security构建Rest服务-0800-Spring Security图片验证码
查看>>
AE待整理
查看>>
java8中规范的四大函数式接口
查看>>
分类---Logistic Regression
查看>>
35.Docker安装Mysql挂载Host Volume
查看>>
Ubuntu 英文下Fcitx 无法输入中文
查看>>
Android压力测试命令monkey详解
查看>>
MySQL_入手<二>之删--改--查
查看>>
MySQL创表--分页--自关联--
查看>>