Oracle中的锁

锁是一种机制,多个事务同时访问一个数据库对象时,该机制可以实现对并发的控制

按照用户系统锁可以分为自动锁和显示锁。

自动锁(系统上锁):DML锁、DDL锁、systemlocks锁

显示锁:用户为数据库对象设定的锁

按照锁的级别可以分为。

排他锁(exclusive lock, X锁):事务设置排他锁后,事务单独获得资源,在此事务提交之前,其他事务不能获取同一资源

和共享锁(share lock,S锁):多个事务可以同时访问同一资源,可以为事务提供高并发性,容易造成死锁和数据更新丢失。

按照操作分为。
1.DML锁(data locks,数据锁):用于控制事务并发中的数据操作,保护数据完整性。

2.DDL锁:DDL是保护表结构定义的。

DML锁又可分为

TM锁(表级锁)

TX锁(事务锁或行级锁)

TM锁

SQL语句:

select * from v$lock where lmode>=0 and type in ('TM','TX');可以查看锁

锁的模式表示如下:

sql例句:

手工锁表:

lock table trwtcTest1 in row share mode nowait;                --1

lock table trwtcTest1 in share update mode nowait;             --2

lock table trwtcTest1 in row exclusive mode nowait;            --3

lock table trwtcTest1 in share mode nowait;                    --4

lock table trwtcTest1 in share row exclusive mode nowait;      --5

lock table trwtcTest1 in exclusive mode nowait;                --6

 

手工解锁:

rollback/commit

DDL锁:DDL是系统自动加锁,从而保护这些对象不会被其他会话所修改。

例如,我执行一个DDL操作ALTERTABLE T,表T上就会加一个排他DDL锁,以防止其他会话得到这个表的DDL锁和TM锁。在DDL语句执行期间会一直持有DDL锁,一旦操作执行就立即释放DDL锁。

有3种类型的DDL锁:

1.排他DDL锁(Exclusive DDL lock):这会防止其他会话得到它们自己的DDL锁或TM(DML)锁。这说明,在DDL操作期间你可以查询一个表,但是无法以任何方式修改这个表。

2.共享DDL锁(Share DDL lock):这些锁会保护所引用对象的结构,使之不会被其他会话修改,但是允许修改数据。

3.可中断解析锁(Breakable parse locks):这些锁允许一个对象(如共享池中缓存的一个查询计划)向另外某个对象注册其依赖性。

锁的粒度

行级锁(TX),表级锁(TM), 数据库级锁:

锁的工作性质:

只有被修改时,行才会被锁定。

当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升级。

当某行被修改时,它将阻塞别人对它的修改。

当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行的修改。

读永远不会阻止写。

读不会阻塞写,但有唯一的一个例外,就是select ...for update。

写永远不会阻塞读。

当一行被修改后,Oracle通过回滚段提供给数据的一致性读

Oracle中的锁的更多相关文章

  1. ORACLE 中的 锁 介绍

    ORACLE 中的 锁 介绍 Oracle数据库支持多个用户同时与数据库进行交互,每个用户都可以同时运行自己的事务,从而也需要对并发访问进行控制.Oracle也是用“锁”的机制来防止各个事务之间的相互 ...

  2. 事务的隔离级别以及oracle中的锁

    事务的概念及特性 事务,一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语 ...

  3. ora-00031:session marked for kill处理oracle中杀不掉的锁

    http://www.cnblogs.com/songdavid/articles/2223869.html 一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定 ...

  4. 【转】ora-00031:session marked for kill处理oracle中杀不掉的锁

    一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不 ...

  5. ORA-00031: session marked for kill 处理Oracle中杀不掉的锁

    一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不 ...

  6. 【原创】如何找到Oracle中哪条记录被锁

    通常有这种情况,某个表或者准确的说是表的某条记录被锁(TX锁),在业务层面排查之余,一般都会想知道是哪条记录被锁,每次被锁的是否是同一条记录?还是每次都不同?通过记录可以找到这条记录可以在哪个模块.哪 ...

  7. 处理Oracle中杀不掉的锁

    一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不 ...

  8. ORACLE中常见的几种锁

    ORACLE中常见的几种锁: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁,sub share 3:Row-X 行独占(RX):用于行的修改,sub exclusive 4 ...

  9. session marked for kill处理oracle中杀不掉的锁

    ora-00031:session marked for kill处理oracle中杀不掉的锁   一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长 ...

随机推荐

  1. 基于Spark的FPGrowth算法的运用

    一.FPGrowth算法理解 Spark.mllib 提供并行FP-growth算法,这个算法属于关联规则算法[关联规则:两不相交的非空集合A.B,如果A=>B,就说A=>B是一条关联规则 ...

  2. Flask从入门到精通之重定向和用户会话

    最新版的hello.py 存在一个可用性问题.用户输入名字后提交表单,然后点击浏览器的刷新按钮,会看到一个莫名其妙的警告,要求在再次提交表单之前进行确认.之所以出现这种情况,是因为刷新页面时浏览器会重 ...

  3. 十分钟用 Node 命令行工具打造 react-cli 脚手架

    如果你有以下想法: 每次新开项目需要copy一堆文件/文件夹,太烦!想要快速建立工程 用了vue-cli.react-app,羡慕!想要自己做一个 你只需花十分钟时间,做一个Node命令行工具,打造属 ...

  4. java保留小数点两位的4种方法

    import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public c ...

  5. WebStorm 最新版本激活方式

    WebStorm 最新版本激活方式:今天下载最新版本的WebStorm,发现原来的通过license server激活的方式,网上的已经失效. 找到一种最新的激活码,今天试了下,是有效的.记录下. 注 ...

  6. centos7无法上网问题

    在虚拟机VM中安装了centos7,无法上网,在同一个虚拟机里,也安装了Ubuntu是可以上网的,不知道咋回事,所以上网查了资料博客,现总结如下. 一.首先打开虚拟的设置,可以看到虚拟机网络的设置默认 ...

  7. C# 中out,ref,params参数的使用

    C#中有三个高级参数,分别是out,ref,params:   1.out参数 方法使用return 只能返回一个值(一个数值或一个指针值),out参数可以帮助我们在一个方法中返回多个值,不限类型. ...

  8. 【hdu4609】 3-idiots FFT

    题外话:好久没写blog了啊-- 题目传送门 题目大意:给你m条长度为ai的线段,求在其中任选三条出来,能构成三角形的概率.即求在这n条线段中找出三条线段所能拼出的三角形数量除以$\binom{m}{ ...

  9. 剑指offer三十七之数字在排序数组中出现的次数

    一.题目 统计一个数字在排序数组中出现的次数. 二.思路 解法一:遍历数组计数 解法二:考虑到时有序数组,所以采用分查找,找到第一个K 和 最后一个K的位置, 二者相减. 三.代码 解法一: publ ...

  10. 关于MyBatis的工作流程和与JDBC的比较与Hibernate的比较

    一.传统的JDBC的方式 1.从一个jdbc程序开始 public static void main(String[] args) { Connection connection = null; Pr ...