zoukankan      html  css  js  c++  java
  • 锁(学习笔记)

    行级锁定和表级锁定:

    行级锁定:

    当用户执行了,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#';

    解除死锁

     

     

  • 相关阅读:
    Java Web 之servlet完整教程
    datediff(date1,date2) 函数的使用
    服务器搭建相关总结
    Oracle中INSTR函数与SQL Server中CHARINDEX函数
    36大数据和about云的文章总结
    oracle中LPAD和RPAD函数的使用方法(加个人总结)
    日常SQL总结
    about云Hadoop相关技术总结
    6.5 hadoop集群运行
    股票主动资金变化曲线分析交易意向和趋势
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4211716.html
Copyright © 2011-2022 走看看