• 获取数据库时间sql 以及行级锁总结-共享锁-排他锁-死锁


    --TRUNC(date,[fmt]) /TRUNC(number[,decimals])
    SELECT SYSDATE FROM dual;
    SELECT TRUNC(SYSDATE) FROM dual
    SELECT TRUNC(12.34524,2) FROM dual;  --12.34
    SELECT TRUNC(-12.34724,2) FROM dual; --12.34
    SELECT TRUNC(12.34524,-1) FROM dual; --10
    --返回当前月的第一天
    SELECT TRUNC(SYSDATE,'month') "First day of current month"  FROM dual;
    --获取当前月最后一天
    SELECT TRUNC(last_day(SYSDATE)) "Last day of current month" FROM dual;
    --获取当前年份的第一天
    SELECT TRUNC(SYSDATE,'YEAR') "Year First day" FROM dual;
    --获取当前年份的最后一天
    SELECT ADD_MONTHS(TRUNC(SYSDATE,'YEAR'),12) -1   "Year Last Day" FROM dual;
    --获取当前月份的天数/年份
    SELECT CAST(to_char(last_day(SYSDATE),'dd') AS INT) number_of_days FROM dual;
    SELECT CAST(to_char(last_day(SYSDATE),'yyyy') AS INT)  NUMBER_of_days FROM dual;
    --获取当前月份剩下的天数
    SELECT SYSDATE, Last_Day (SYSDATE) "Last",Last_Day (SYSDATE) -SYSDATE "Day Left" FROM dual;
    --获取两个日期之间的天数
    SELECT TRUNC ( to_date('2014/02/01','yyyy/mm/dd') -  to_date('2012/05/01','yyyy/mm/dd') ,1) "days" FROM dual;
    --显示当前年份截止到上个月每个月开始和结束的日期
    SELECT  ADD_MONTHS(TRUNC(to_date('2016/05/01','yyyy/mm/dd'),'MONTH'),i) start_date,
           TRUNC(last_day(ADD_MONTHS(to_date('2016/05/01','yyyy/mm/dd') ,i))) end_date
    FROM XMLTABLE(
           'for $i in 0 to xs:int(A) return $i'
           PASSING XMLELEMENT (
                   A,
                   FLOOR(
                        MONTHS_BETWEEN(
                              ADD_MONTHS(TRUNC(to_date('2016/12/01','yyyy/mm/dd'),'Year') - 1 ,12),to_date('2016/05/01','yyyy/mm/dd') )
                        )
                   )
                   columns i INTEGER PATH '.'
    );
    SELECT  ADD_MONTHS(TRUNC(SYSDATE,'MONTH'),1) start_date FROM dual;
    SELECT  TRUNC(last_day(ADD_MONTHS(SYSDATE ,1))) end_date FROM dual;
    --获取今天开始的秒数和剩下的秒数
    SELECT (SYSDATE -TRUNC(SYSDATE))*24*60*60 "Past" , (TRUNC(SYSDATE + 1) -SYSDATE )*24*60*60 "future" FROM dual;


    --数字相关
    --把数值转换成文字
    SELECT to_char(to_date(1526,'j'),'jsp' ) FROM dual;
    --在包的源代码中查询字符串
    SELECT * FROM dba_source
    WHERE UPPER(text) LIKE '%FOO_SOMETHING%'
    AND owner = 'user_name'
    --在oracle中做行数据乘法
    WITH tbl
         AS (SELECT -2 num FROM DUAL
             UNION
             SELECT -3 num FROM DUAL
             UNION
             SELECT -4 num FROM DUAL),
         sign_val
         AS (SELECT CASE MOD (COUNT (*), 2) WHEN 0 THEN 1 ELSE -1 END val
               FROM tbl
              WHERE num < 0)
      SELECT EXP (SUM (LN (ABS (num)))) * val
        FROM tbl, sign_val
    GROUP BY val;

    --生成随机数值
    SELECT ROUND(dbms_random.value()*100) +1 AS random_num FROM dual;
    --检查表中是否有任何数据
    SELECT *
      FROM SINO_DP_HEADER_INPUT
     WHERE ROWNUM = 1;


    --数据字典查询
    --检查在当前数据库模式下是否存在指定的表
    SELECT * FROM USER_tables
    WHERE table_name = 'SINO_DP_HEADER_INPUT';
    --检查在当前表中是否存在指定的列
    SELECT column_name AS FOUND
    FROM user_tab_cols
    WHERE table_name = 'SINO_DP_HEADER_INPUT'
         AND column_name = 'DP_NUMBER'
    --获取当前模式名字
    SELECT sys_context ('userenv','current_schema') FROM dual;


    --数据库管理查询
    --数据库版本信息
    SELECT * FROM V$version;
    --数据库默认信息
    SELECT username,PROFILE,default_tablespace,temporary_tablespace FROM dba_users;
    --数据库字符设置信息
    SELECT * FROM Nls_Database_Parameters;
    --存储区分大小写数据,但是索引不区分大小写
    CREATE TABLE tab (col1 VARCHAR2(10));
    CREATE INDEX idx1 ON tab (UPPER(col1));
    ANALYZE TABLE a COMPUTE STATISTICS;
    --调整没有添加数据文件的表空间
    ALTER DATABASE DATAFILE '/work/oradata/STARTST/STAR02D.dbf' RESIZE 2000M;
    --检查表空间的自动扩展开关
    SELECT SUBSTR (file_name,1,50) ,autoextensible FROM dba_database_files;
    SELECT tablespace_name, autoextensible FROM dba_data_files;
    --在表空间添加数据文件
    ALTER TABLESPACE data01 ADD DATAFILE '/work/oradata/STARTST/data01.dbf' SIZE 1000m AUTOEXTEND OFF;
    --获取数据库的实际大小
    SELECT SUM(bytes) /1024/1024/1024 AS GB FROM dba_data_files;


    --性能相关查询
    --查询用户cpu的使用率
    SELECT ss.username,se.sid, VALUE/100 cpu_usage_seconds
    FROM v$vession SS, v$sesstat se,v$statname sn
    WHERE se.statics# = sn.statics#
          AND NAME LIKE '%CPU used by this session%'
          AND se.sid = ss.sid
          AND ss.status = 'ACTIVE'
          AND ss.username IS NOT NULL
    ORDER BY VALUE DESC;

    --获取当前会话id,进程id,客户端id等
    SELECT b.sid ,b.serial#,a.spid processid , b.process clientpid
    FROM v$process a , v$session b
    WHERE a.addr = b.PADDR AND b.AUDSID = USERENV('sessionid');     
    --在视图中查询并显示实际的oracle链接
    SELECT osuser,username,machine,program
    FROM v$session
    ORDER BY osuser;
    --查询并显示链接oracle的用户和用户的会话数量
    SELECT username ,COUNT(username) co
    FROM v$session
    GROUP BY username
    ORDER BY co DESC ;

    --获取拥有者的对象数量
    SELECT owner,COUNT(owner) obj
    FROM dba_objects
    GROUP BY owner
    ORDER BY obj DESC;


    -- 查询锁的状况的对象有?
    V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS ;
    --查询锁的表的方法:
    SELECT S.SID SESSION_ID, S.USERNAME,
    DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(LMODE))
    MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(REQUEST))
     MODE_REQUESTED, O.CCBZZP||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')', S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2
     FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID ;
    --如何解锁?
    ALTER SYSTEM KILL SESSION ‘SID,SERIR#’;


    --mysql 行级锁的使用以及死锁的预防

    --1.mysql的innoDB,支持事务和行级锁,可以使用行级锁来处理用户提现等业务。使用mysql锁的时候会出现死锁。
    --Mysql 行级锁
    --共享锁:共享锁即读锁,所有的事务只能对其进行读操作不能写操作,加上共享锁后再事务之前其他事务只能再加共享锁,除此之外其他任何类型的锁都不能再加了。
    SELECT ID FROM TABLE WHERE ID IN (1,2) LOCK IN SHARE MODE  -- 结果集的数据都会加共享锁
    --排它锁:若某个事务对某一行加上了排它锁,只能这个事务进行读写, 在此事务结束之前, 其他事务不能对其进行加任何锁,其他进程可以读取,不能写入,需等待其释放
    SELECT ID FROM TABLE WHERE ID IN (1,2) FOR UPDATE
    --死锁:两个以上的进程都要求对方释放资源,以至于进程都一直等待。产生条件:互斥条件,环路条件,不可剥夺,缺一不可,相对应的只要破幻其中一个条件死锁就不会产生
    --第一条语句会优先使用name 索引,因为name 不是主键索引,还会用到主键索引
    --第二条语句首先使用主键索引,再使用name 索引,
    --如果两条语句同时执行,第一条语句执行了name索引等待第二条释放主键索引,第二条执行主键索引等待第一条的name索引,
    --这样就造成了死锁
    UPDATE mk_user SET NAME = '1' WHERE NAME='id'
    UPDATE mk_user SET NAME = '2' WHERE ID = 2
    --改造
    UPDATE mk_user SET NAME = '1' WHERE ID = (SELECT ID FROM mk_user WHERE NAME ='id')
    UPDATE mk_user SET NAME = '2' WHERE ID = 2
    --操作限制  共享锁与非共享锁
    --锁申请前提:当前没有线程对该结果集中的任何行使用排它锁,否则申请回堵塞
    --线程           读取操作       写入操作         共享锁申请        排它锁申请
    --使用共享锁        可读        可写/不可写(报错) 可申请             可申请
    --不适用共享锁      可读       不可写(堵塞)       可申请             不可申请(阻塞)

    --1.使用共享锁线程可对其锁定记录进行读取,其他线程同样也对锁定记录进行读取操作,并且这两个线程读取的数据属于同一版本
    --2.对于写操作,使用共享锁的线程需分情况讨论,
    --  ①当只有当前线程对执行记录使用共享锁时,线程是可以对记录进行写入操作的(包括更新和删除),这是由于在写入操作之前,线程向该记录申请了排它锁,然后才进行写入操作;
    --  ②当其他线程也对该记录使用共享锁时, 则不可进行写入操作, 系统会有报错提示。
    -- 不使用共享锁的线程,不可进行写入操作,写入会阻塞
    --3.使用共享锁进行可再次对锁定记录申请共享锁,系统不报错,其他线程也可对锁定记录申请共享锁。
    --4.使用共享锁进行可对其锁定记录申请排他所, 其他进程不可以对锁定记录申请排它锁,申请会阻塞

    --排他锁: mysql 会对查询结果集每行都添加排它锁,在事务操作中,任何记录的更新和删除操作会自动加上排它锁
    --锁申请前提: 当前没有线程对该结果集中的任何行使用排它锁或共享锁,否则申请会阻塞
    --线程           读取操作       写入操作         共享锁申请        排它锁申请
    --使用排他锁      可读(新版本)      可写           可申请             可申请
    --不适用排他锁    可读 (旧版本)    不可写(堵塞)  不可申请 (堵塞)  不可申请(阻塞)
    --1.使用排他锁线程可以对其锁定记录进行读取,读取的内容为当前事务的最新版本;而对于不适用排它锁的线程,同样是可以进行读取操作的,这种特性是一致性非锁定读。
    --  即:对于同一条记录,数据库记录多个版本,在事务内的更新操作会反应到新版本中,旧版本会提供给其他线程进行读取操作
    --2.使用排他锁线程可对其锁定记录进行写入操作,对于不使用排他锁的线程,对锁定记录的写入操作时不允许的。
    --3.使用排他锁进程可对其锁定记录申请共享锁,但是申请共享锁之后,线程并不会释放原先的排他锁,因此数据对外表现排他锁性质,其他线程不可对锁定数据申请共享锁

  • 相关阅读:
    angularjs基础——控制器
    angularjs基础——变量绑定
    mysql 小数处理
    centos无法联网解决方法
    mysql 按 in 顺序排序
    html5 file 自定义文件过滤
    淘宝、天猫装修工具
    MapGis如何实现WebGIS分布式大数据存储的
    CentOS
    PHP与Python哪个做网站产品好?
  • 原文地址:https://www.cnblogs.com/LinuxSuDa/p/6293939.html
Copyright © 2020-2023  润新知