一:简单使用
1、ssh进入sqlplus
root@75aff9841f5b:/# su - oracle
oracle@75aff9841f5b:~$ sqlplus /nolog
SQL*Plus: Release 11.2.0.2.0 Production on Fri Aug 23 03:59:55 2019
Copyright (c) 1982, 2011, Oracle. All rights reserved.
SQL> conn system/oracle
Connected.
2、sqldevelop配置
select userenv('language') from dual;-----数据库使用编码
select * from V$NLS_PARAMETERS;-----环境变量编码
对比两个编码,如果不同则设置电脑环境变量(NLS_LANG=数据库使用编码),用户级环境变量即可
二:使用了解
1、锁
锁
数据库是一个多用户使用的共享资源。多个用户并发在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。
当数据对象被加上排它锁时,其他的事务不能对它读取和修改;加了共享锁的数据对象可以被其他事务读取,但不能修改。
锁分类
根据保护对象的不同,Oracle数据库锁可分为:
DML lock(data locks,数据锁):用于保护数据的完整性。
DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义)。
Internal locks 和latches(内部锁与闩):保护内部数据库结构。
Distributed locks(分布式锁):用于OPS(并行服务器)中。
PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。
DML锁分类
Oracle中最主要的锁是DML锁,DML锁的目的在于保证并发情况下的数据完整性。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
共享锁(S锁)
可通过lock table in share mode命令添加该S锁。在该锁定模式下,不允许任何用户更新表。但是允许其他用户发出select …from for update命令对表添加RS锁。
排他锁(X锁)
可通过lock table in exclusive mode命令添加X锁。在该锁定模式下,其他用户不能对表进行任何的DML和DDL操作,该表上只能进行查询。
行级共享锁(RS锁)
通常是通过select … from for update语句添加的,同时该方法也是我们用来手工锁定某些记录的主要方法。
行级排他锁(RX锁)
当进行DML操作时会自动在被更新的表上添加RX锁,或者也可以通过执行lock命令显式的在表上添加RX锁。在该锁定模式下,允许其他的事务通过DML语句修改相同表里的其他数据行,或通
过lock命令对相同表添加RX锁定,但是不允许其他事务对相同的表添加排他锁(X锁)。
共享行级排他锁(SRX锁)
通过lock table in share row exclusive mode命令添加SRX锁。该锁定模式比行级排他锁和共享锁的级别都要高,这时不能对相同的表进行DML操作,也不能添加共享锁。
死锁
例:
SELECT * FROM testLock FOR UPDATE; -- 行级共享锁(RS锁),并对内容进行修改,未提交
delete from testLock WHERE ID=1; -- 行级排他锁(RX锁),RS和RX可以共存,此时产生死锁
死锁查看
SQL> select s.username,l.object_id, l.session_id,s.serial#, s.lockwait,s.status,s.machine,s.program from v$session s,v$locked_object l where s.sid = l.session_id;
USERNAME SESSION_ID SERIAL# LOCKWAIT STATUS MACHINE PROGRAM
---------- ---------- ---------- -------- -------- ---------------------- ------------
SYS 146 104 INACTIVE WORKGROUPJ-THINK PLSQLDev.exe
SYS 144 145 20834474 ACTIVE WORKGROUPJ-THINK PLSQLDev.exe
tips:
Username:死锁语句所用的数据库用户;
SID: session identifier, session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。
SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。
Lockwait:可以通过这个字段查询出当前正在等待的锁的相关信息。
Status:用来判断session状态。Active:正执行SQL语句。Inactive:等待操作。Killed:被标注为删除。
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。
查看引起死锁的语句
SQL> 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));
SQL_TEXT
------------------------------------------------------------
delete from testLock where ID = 1
兼容关系
- S X RS RX SRX N/A
----- ----- ----- ----- ----- ----- -----
S Y N Y N N Y
----- ----- ----- ----- ----- ----- -----
X N N N N N Y
----- ----- ----- ----- ----- ----- -----
RS Y N Y Y Y Y
----- ----- ----- ----- ----- ----- -----
RX N N Y Y N Y
----- ----- ----- ----- ----- ----- -----
SRX N N Y N N Y
----- ----- ----- ----- ----- ----- -----
N/A Y Y Y Y Y Y
锁与SQL对应关系
基本上所有的锁都可以由Oracle内部自动创建和释放,但是其中的DDL和DML锁是可以通过命令进行管理的,命令语法:
LOCK table_name IN
[row share][row exclusive][][share row exclusive][exclusive] MODE
[NOWAIT];
SQL语句 锁定模式 兼容其他的模式
select * from ...... RS RS、RX、S、SRX、X
-----------------------------------------------------------------------------------
insert into ...... RX RS、RX
-----------------------------------------------------------------------------------
update ...... RX RS、RX
-----------------------------------------------------------------------------------
delete from ...... RX RS、RX
-----------------------------------------------------------------------------------
select * from table_name for update RS RS、RX、S、SRX
-----------------------------------------------------------------------------------
lock table_name in row share mode RS RS、RX、S、SRX
-----------------------------------------------------------------------------------
lock table_name in row exclusive mode RX RS、RX
-----------------------------------------------------------------------------------
lock table_name in share mode S RS、S
-----------------------------------------------------------------------------------
lock table_name in share row exclusive mode SRX RS
-----------------------------------------------------------------------------------
lock table_name in exclusive mode X RS
-----------------------------------------------------------------------------------