zoukankan      html  css  js  c++  java
  • Oracle事务和锁

    --什么是事务
      事务就是一组包含一条或多条语句的逻辑单元,每个事务都是一个原子单位。
    在事务中的语句被作为一个整体,要么一起提交,作用在数据库上,使数据库数据
    永久的修改;要么一起撤销,对数据库不做任何修改。
    
    --事务控制语句
    set transaction :设置事务的属性。
    commit :提交事务。
    savepoint :设置事务保存点。
    rollback :回滚事务。
    rollback to savepoint :回滚至保存点。
    
    --设置事务是否自动提交,用来控制DML语句
    set autocommit on/off;
    
    --DDL语句是自动提交事务的。
    
    --事务的特性
    1、原子性:事务对数据的修改要么完全执行,要么完全不执行。
    2、一致性:事务在执行前后数据库都必须处于一致性。也就是只要事务提交成功后,其他用户才可以看到修改后的数据。
    3、分离性:分离性是指并发事务之间不能互相的干扰。一个事务操作的数据不会被其他事务看到和操作。
    4、持久性:事务一旦提交完成,数据就已经永修被修改。
    
    
    --锁的介绍
    锁可以防止事务之间的破坏行交互。约束了最大程度的并发性。数据的完整型。
    
    
    --锁的分类
    1、排他锁(X锁)。防止资源共享,也就是当一个事务正在操作的数据时,其他事务不可以操作这个事务的数据。
    2、共享锁(S锁)。被锁主的数据只能被读取,不能被修改。也不可以添加X锁。但可以添加S锁。
    --锁的类型
    DML锁:也叫数据锁,用于保护数据。
    DDL锁:可以保护模式中对象的结构。
    内部闩锁:保护数据库的内部结构,完全自动调用。
    
    行级锁(TX锁),也叫事务锁。防止记录同时被两个事务修改。
    表级锁(TM锁),防止在修改表数据时,表的结构发生变化。
    
    
    --DDL锁
    Exclusive DDL lock :排他DDL锁定,如果对象被添加了此锁,就被能被其他会话修改,也不能在增加其他DDL锁。如果是表,此时表数据只可以读取。
    Shared DDL lock :共享DDL锁定,保护对象的结构,其他会话不能修改该对象的结构,但可以修改数据。
    Breakable Parsed Lock : 此类锁可以被打断,不能禁止DDL操作。
    
    --锁等待和死锁
    锁等待也叫锁冲突。锁等待会严重地影响数据库性能和日常工作。
    死锁,死锁也就是,锁等待的一种,但死锁会让事务一直处于锁等待的状态。
    
    
    --解决死锁的情况
    1、登录OEM管理器。
    2、进如实例锁界面。
    3、查找到阻塞锁,就终止掉次锁,也可以使用Kill 关键字杀死次会话。
    
    --查看是否有死锁
    select username, lockwait, status, machine, program
      from v$session
     where sid in (select session_id from v$locked_object);
    
    --如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
    Username:死锁语句所用的数据库用户;
    Lockwait:死锁的状态,如果有内容表示被死锁。
    Status: 状态,active表示被死锁
    Machine: 死锁语句所在的机器。
    Program: 产生死锁的语句主要来自哪个应用程序。
    
    --用dba用户执行以下语句,可以查看到被死锁的语句
    select sql_text
      from v$sql
     where hash_value in
           (select sql_hash_value
              from v$session
             where sid in (select session_id from v$locked_object))
    
    --杀死死锁
    alter system kill session 'sid';
    --(其中sid=l.session_id)
    
    --如果还不能解决: 
    select pro.spid
      from v$session ses, v$process pro
     where ses.sid = XX
       and ses.paddr = pro.addr;
    
    --其中sid用死锁的sid替换: 
    exit
       ps -ef | grep spid ;
    
    --其中spid是这个进程的进程号,kill掉这个Oracle进程。
  • 相关阅读:
    spring boot.定时任务问题记录(TaskScheduler/ScheduledExecutorService异常)
    网站配置https(腾讯云域名操作)
    Java web如何定位工程路径
    centos7安装nginx
    个人博客搭建----基于solo
    velocity学习总结
    第四篇:用IntelliJ IDEA 搭建基于jersey的RESTful api
    Python 包批量升级
    Linux 常用命令更新汇总
    ubuntu 18.04 +firefox + selenium + python
  • 原文地址:https://www.cnblogs.com/gynbk/p/6556147.html
Copyright © 2011-2022 走看看