文档库 最新最全的文档下载
当前位置:文档库 › Oracle的事务及锁

Oracle的事务及锁

Oracle的事务及锁
Oracle的事务及锁

1、事务的概念:

事务是一个基本的逻辑单元,它作为一个整体要么全部执行要么全部不执行。

2、事务的特性:

原子性:事务是处理的一个原子单位,每一个操作不可拆分,它要么全部执行成功,要么全部都不执行。

一致性:指事务完成时,必须使所有的数据在整体上不变。

隔离性:各事务之间相互隔离,此事务的执行不受其他并发事务执行的干扰。

持续性:指事务对数据库的改变应是持续存在的,不会因故障而发生丢失。

3、从功能是上划分,sql语言分为DDL、DML和DCL:

3.1DDL(Data Definition Language,数据定义语言):

用于定义和管理数据库中的所有对象的语言,如:create创建表空间、alter修改表空间、drop 删除表空间

3.2:DML(Data manipulation Language,数据操作语言):

处理数据等操作,如:insert插入数据、delete删除数据、update修改数据、select查询数据3.3:DCL(Data Control Language,数据控制语言):

授予或回收访问数据库的权限,控制数据库操作事务发生的时间及效果,对数据库实行监视,如:grant授权,rollback回滚,commit提交

4、事务的开始及结束:

一个事务可以由一条DDL语句单独组成或多条DML语句共同组成。一个事务从执行第一条sql语句开始,在它被提交或被回滚时结束。事务的提交可以是显式提交:用commit命令直接完成;也可以是提交隐式提交:用sql语句间接完成提交,这些语句有:alter,audit,comment,create,disconnect,drop,exit,grant,noaudit,quit,revoke,rename,会话终止等;还可以是自动提交:set autocommit on或set autocommit immediate设置为自动提交,则在插入、删除、修改语句执行后自动提交,使用set autocommit off可以取消自动提交,show autocommit可以查看自动提交是否打开。事务的回滚使用rollback;语句,可以为事务设置保存点,如:savepoint point1,然后使用rollback to [savepoint] point1回到保存点point1,若在point1后又设置了一个保存点savepoint point2,则在rollback to point1后将不能再回滚到point2,因为point2在point1的后面,point1的保存点不存在point2。

5、事务的并发性与一致性:

并发性:多个用户可以在同一时刻访问相同的数据。

一致性:保证并发性的同时,每个用户能得到一致的数据视图。

并发执行事务时,可能发生如下情况:

①脏读:某个事务读取了其他未提交事务修改过的数据。

脏读示例:提交读隔离级别可防止脏读,但不能防止不可重复读

②不可重复读:某个事务读取一次数据后,其他事务修改了这些数据并进行了提交,这样当该事务重新读取这些数据时,就会得到与前一次读取不一致的结果。简单的说,就是同样的条件,你读取过的数据,再次读取时发现值不一样了。

不可重复读示例:可重复读隔离级别可防止脏读和不可重复读

又插入或删除了一些满足查询条件的记录,这样当该事务重新执行相同的查询时,会得到与前一次查询不一致的情况。简单的说,就是同样的条件,第一次和第二次读出来的记录数不一样了。

幻象示例:

④更新丢失:例如系统允许两个事务A、B同时更新同一数据50,A事务和B事务同时取得该数据,A事务将50加上50得到100,然后保存回数据库;而事务B将50加上100得到150,然后保存数据时覆盖了事务A保存的数据。两个事务更新后的数据本该是200,而结果A更新的50丢失了。

6、解决数据脏读、不可重复读等问题的隔离级别:

Oracle提供了三种隔离级别:Read Committed(提交读)、Serializable(串行读)、Read Only(只读)。

①Read Committed是Oracle默认隔离级别,若事务A先于事务B开始,事务B是Read Committed隔离级别,则不管事务A是哪种隔离级别,只要事务A未提交,事务B就会一直处于等待状态,直到事务A提交为止。Read Committed消除了脏读,也不会丢失更新,但无法避免不可重复读和幻象读的发生。

②Serializable串行化隔离级别,确保事务顺序执行不被干扰,只要Serializable的事务在执行期间,其他事务要对其数据进行修改,便会发生无法序列化的访问错误,可以避免脏读、不可重复读、幻象、更新丢失,提供了最高级别的一致性,但并发性最低。

⑤Read Only只读隔离级别不允许在事务内对其进行修改或插入等更新操作。Read Only 可以消除脏读。

SQL-92规范制定的4种隔离级别:

☆未提交读(read uncommitted)

☆提交读(read committed)

☆可重复读(repeatable read)

☆串行读(serializable read)

总结:

设置一个事务的隔离级别:

SET TRANSACTION ISOLA TION LEVEL READ COMMITTED; --设置Read Committed级别SET TRANSACTION ISOLA TION LEVEL SERIALIZABLE; --设置Serializable级别

SET TRANSACTION READ ONLY;--设置Read Only级别

设置整个会话的隔离级别:

ALTER SESSION SET ISOLA TION_LEVEL SERIALIZABLE;

ALTER SESSION SET ISOLA TION_LEVEL READ COMMITTED;

8、事务与锁

锁机制用于管理对共享资源的并发访问,防止访问相同资源时发生的有害性交互。基本上所有的锁都由oracle内部自动创建和维护,但是其中的DDL和DML锁是可以通过命令直接或间接管理的。

当事务在对某个数据对象进行操作前,先向系统发出请求,对其所访问的数据对象加锁,加锁后事务就对该数据对象有一定的控制,在该事务释放锁之前,其他事务不能对此数据对象进行更新操作。

Oracle提供的两种类型的锁机制:

①独占锁:防止相关资源被共享,主要用来修改数据,只有在独占资源的事务释放独占锁后,其他事务才能对其资源进行操作。

②共享锁:允许相关资源的共享,依赖于所包含的操作,多个用户读数据可以使用共享锁。

Oracle中锁的类型:

①内部级锁:由Oracle自动管理,以保护Oracle的内部结构。

②DDL级锁(字典/语法分析锁):用于保护数据字典和数据定义改变时的一致性和完整性,由系统在对sql定义语句做语法分析时自动加锁,如该锁在使用create、drop、alter、truncate 语句时自动创建,以确保在执行过程中没有其他事务对资源进行访问。DDL锁可分为三类:字典操作锁、字典定义锁、表定义锁。

③DML级锁:用于控制并发事务中的数据操作,保证数据的一致性和完整性,其锁对象是表或行,在事务开始时创建,事务提交或回滚时释放。DML锁可以由用户以显式的方式加锁,也可以通过sql语句隐式加锁。

DML封锁技术:

Ⅰ、共享方式的表封锁(share):lock table 表名[,表名]… in share mode [nowait];

共享方式的表封锁是对表中的所有数据进行封锁,该锁用于保护查询数据的一致性,防止其他用户对已封锁的表进行更新,其他用户只能对该表再施加共享方式的锁,而不能再对该表施加独占方式的锁。共享该表的所有用户只能查询表中数据,不能更新,只能用sql语句加该锁。如下方式可以释放该锁:commit或rollback语句,退出数据库,程序停止运行。Ⅱ、独占方式的表封锁(exclusive):lock table 表名[,表名]… in exclusive mode [nowait]; 独占方式的表封锁对表中的所有数据进行封锁,拥有该独占方式的表封锁的用户,既可以查询该表又可以更新该表,其他用户不能再对该表施加任何锁,其他用户只可以查询该表。独占方式的表封锁还可以在执行DML语句insert、update、delete时隐式获得。如下方式可以释放该锁:commit或rollback语句,退出数据库,程序停止运行。

Ⅲ、共享更新方式封锁(share update):lock table 表名[,表名]… in share update mode

[nowait];或者

select 列名[,列名]…

from 表名

where 条件

for update of 列名[,列名]… [nowait];

共享更新方式封锁是对表的一行或多行进行封锁,也称为行级锁。该锁使得用户可以查询也可以更新被封锁的数据行,其他用户只能查询,若其他用户想更新表的数据行,则必须也要加共享更新方式锁,但其他用户的更新必须在上一个用户提交或回滚后才行。如下方式可以释放该锁:commit语句,退出数据库,程序停止运行。

10、死锁

下例便是一个死锁:

会话A更新表A会话B更新表B

会话B更新表A--阻塞

会话A更新表B--导致死锁

Oracle处理死锁的方式:Oracle系统会自动发现死锁,并选择代价小的,即完成工作量最少的事务予以撤销,释放该事务所拥有的全部锁,让其他事务继续工作下去。

11、加锁的注意事项:

①对于update、delete操作,应只封锁要做改动的行,在完成修改后立即提交。

②当多个事务正利用共享更新的方式进行更新,则不要使用共享封锁,而应采用共享更新锁,这样其他用户就能使用行级锁,以增加并行性。

③尽可能将对一个表的操作的并发事务施加共享更新锁,从而提高并行性。

④在应用负荷较高的期间,不宜对基础数据结构(表、索引、簇、视图)进行修改。

12、加锁语句:

☆lock table 表名in 锁定模式mode [nowait];

解释:锁定模式为share表示共享锁(允许加锁,不许修改),为share update表示共享更新方式封锁,为exclusive表示独占锁(不许加锁,不许修改),为row share表示行级共享锁(允许加锁,不许修改),为row exclusive表示行级独占锁(不许加锁,不许修改),为share row exclusive表示共享行级独占锁(对相应行加独占锁,对表加共享锁,其他事务可对其他行加独占锁)。nowait选项表示锁未添加成功时,则返回并由用户决定等待还是去执行其他语句。☆添加行级共享锁:select… from 表名 for update;

☆create语句自动加共享锁,alter语句自动加独占锁,insert、update、delete语句自动添加行级独占锁。

【VIP专享】Oracle权限、角色和用户

Oracle数据库权限、角色和用户总结 前言: ORACLE数据库系统预先定义了CONNECT 、RESOURCE、DBA、EXP_FULL_DATABASE、IMP_FULL_DATABASE五个角色。 CONNECT具有创建表、视图、序列等特权;(alter session create cluster ) RESOURCE具有创建过程、触发器、表、序列等特权、 DBA具有全部系统特权; EXP_FULL_DATABASE、IMP_FULL_DATABASE具有卸出与装入数据库的特权。 权限管理 一、权限分类 系统权限:系统规定用户使用数据库的权限。(系统权限是对用户而言)。 实体权限:某种权限用户对其它用户的表或视图的存取权限。(是针对表或视图而言的)。 二、系统权限管理: 1、系统权限分类: DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。 RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。 CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构。 对于普通用户:授予connect, resource权限。 对于DBA管理用户:授予connect,resource, dba权限。 2、系统权限授权命令: [系统权限只能由DBA用户授出:sys, system(最开始只能是这两个用户)] 授权命令:SQL> grant connect, resource, dba to 用户名1 [,用户名2]...; [普通用户通过授权可以具有与system相同的用户权限,但永远不能达到与sys用户相同的权限,system用户的权限也可以被回收。] 例:

oracle的TM锁、TX锁知识完全普及 (2)

o r a c l e的T M锁、T X锁知识完全普及锁概念基础 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。 在数据库中有两种基本的锁类型:排它锁(ExclusiveLocks,即X锁)和共享锁(ShareLocks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。 Oracle数据库的锁类型 根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(datalocks,数据锁),用于保护数据的完整性;DDL锁(dictionarylocks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internallocksandlatches),保护数据库的内部结构。 DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。 当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX 锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。 在数据行上只有X锁(排他锁)。在Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。 当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。 悲观封锁和乐观封锁 一、悲观封锁 锁在用户修改之前就发挥作用: Select..forupdate(nowait)

Oracle用户被锁定解决方法

Oracle用户被锁定解决方法 分类:oracle管理2011-12-27 11:183692人阅读评论(0)收藏举报oraclelogindatesessionusersql 1、用dba角色的用户登陆,进行解锁,先设置具体时间格式,以便查看具体时间 SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; Session altered. 2、查看具体的被锁时间 SQL> select username,lock_date from dba_users where username='TEST'; USERNAME LOCK_DATE TEST 2009-03-10 08:51:03 3、解锁 SQL> alter user test account unlock; User altered. 4、查看是那个ip造成的test用户被锁 查看$ORACLE_HOME/network/admin/log/listener.log日志 10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=oracle)(HO ST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49434)) * establish * lhoms * 0 10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=oracle)(HO ST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49435)) * establish * lhoms * 0 这样可知是上面10.69.1.11的ip尝试多次失败登陆造成的被锁 注: 一般数据库默认是10次尝试失败后锁住用户 1、查看FAILED_LOGIN_ATTEMPTS的值 select * from dba_profiles where RESOURCE_NAME = 'FAILED_LOGIN_ATTEMPTS'; 2、修改为30次 alter profile default limit FAILED_LOGIN_ATTEMPTS 30; 3、修改为无限次(为安全起见,不建议使用) alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;

Oracle的五种锁

Oracle的五种Table Lock Oracle中的锁定可以分为几类:DML lock(data lock),DDL lock(dictionary lock)和internal lock/latch。 DML lock又可以分为row lock和table lock。row lock在select.. for update/insert/update/delete时隐式自动产生,而table lock除了隐式产生,也可以调用lock table in name来显示锁定。 如果不希望别的session lock/insert/update/delete表中任意一行,只允许查询,可以用lock table table_name in exclusive mode。(X)这个锁定模式级别最高,并发度最小。 如果允许别的session查询或用select for update锁定记录,不允许insert/update/delete,可以用lock table table_name in share row exclusive mode。(SRX) 如果允许别的session查询或select for update以及lock table table_name in share mode,只是不允许insert/update/delete,可以用lock table table_name in share mode。(share mode和share row exclusive mode的区别在于一个是非抢占式的而另一个是抢占式的。进入share row exclusive mode后其他session不能阻止你insert/update/delete,而进入share mode后其他session也同样可以进入share mode,进而阻止你对表的修改。(S) 还有两种锁定模式,row share(RS)和row exclusive(RX)。他们允许的并发操作更多,一般直接用DML语句自动获得,而不用lock语句。 ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁,sub share 3:Row-X 行独占(RX):用于行的修改,sub exclusive 4:Share 共享锁(S):阻止其他DML操作,share 5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive 6:exclusive 独占(X):独立访问使用,exclusive 数字越大锁级别越高, 影响的操作越多。 1级锁有:Select,有时会在v$locked_object出现。 2级锁有:Select for update,Lock For Update,Lock Row Share select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete 或select for update操作。 3级锁有:Insert, Update, Delete, Lock Row Exclusive 没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。 4级锁有:Create Index, Lock Share

数据库锁表与解锁

数据库锁表与解锁 一、mysql 锁定表:LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…] 解锁表:UNLOCK TABLES 例子: LOCK TABLES table1 WRITE ,table2 READ 、、、更多表枷锁; 说明:1、READ 锁代表其她用户只能读不能其她操作 2、WRITE锁代表:其她用户不能任何操作(包括读) 查瞧那些表被锁:show OPEN TABLES where In_use > 0; 全局加锁:FLUSH TABLES WITH READ LOCK(这个命令就是全局读锁定,执行了命令之后所有库所有表都被锁定只读。解锁也就是:UNLOCK TABLES ) 二、oracle --行级锁定(同样对 mysql起作用) 通过 :select * from tableName t for update 或 select * from tableName t where id =1 for update 前者锁定整个表,后者多顶 id=1的一行数据(有主键,并且指定主键=值的只 锁定指定行) 说明:通过 select 、、、 for update 后其她用户只能读不能其她操作,锁定者通过 commit或 rollback命令自动解锁,或使用本文的解锁方式

(will)! --表级锁定 lock table in mode [nowait] 其中: lock_mode 就是锁定模式 nowait关键字用于防止无限期的等待其她用户释放锁 五种模式如下(1到5 级别越来越高,限制越来越大): 1、行共享(row share,rs):允许其她用户访问与锁定该表,但就是禁止排她锁定 整个表 2、排她锁(row exclusive ,rx):与行共享模式相同,同时禁止其她用户在此表上使用共享锁。使用select 、、、 for update语句会在表上自动应用行排她锁 3、共享(share ,s):共享锁将锁定表,仅允许其她用户查询表中的行,但不允许插入、更新、删除行。多个用户可以在同一表中放置共享锁,即允许资源共享,,因此得名“共享锁”。例如:如果用户每天都需要在结账时更新日销售额表,则可以在更新该表时使用共享锁以确保数据的一致性。 4、共享排她锁(share row exclusive,srx):执行比共享锁更多的限制。防止其 她事务在表上应用共享锁,、共享排她锁以及排她锁。 5、排她(exclusive,x):对表执行最大的限制。除了允许其她用户查询该表记录, 排她锁防止其她事务对表做任何更改或在表上应用任何类型的锁。 实例: lock table table_Name in exclusive mode; 要解锁需要锁定人执行 commit 或 rollback 或者用本文的解锁方式 (will)! --查询锁表 SELECT /*+ rule */ S、USERNAME, DECODE(L、TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,

介绍一下Oracle悲观锁和乐观锁

介绍一下Oracle悲观锁和乐观锁 为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定。数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁。什么叫悲观锁呢,悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。而乐观锁就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息,让用户决定如何去做。先从悲观锁开始说。在SqlServer等其余很多数据库中,数据的锁定通常采用页级锁的方式,也就是说对一张表内的数据是一种串行化的更新插入机制,在任何时间同一张表只会插1条数据,别的想插入的数据要等到这一条数据插完以后才能依次插入。带来的后果就是性能的降低,在多用户并发访问的时候,当对一张表进行频繁操作时,会发现响应效率很低,数据库经常处于一种假死状态。而Oracle用的是行级锁,只是对想锁定的数据才进行锁定,其余的数据不相干,所以在对Oracle表中并发插数据的时候,基本上不会有任何影响。注:对于悲观锁是针对并发的可能性比较大,而一般在我们的应用中用乐观锁足以。Oracle的悲观锁需要利用一条现有的连接,分成两种方式,从SQL语句的区别来看,就

是一种是for update,一种是for update nowait的形式。比如我们看一个例子。首先建立测试用的数据库表。CREATE TABLE TEST(ID,NAME,LOCATION,VALUE,CONSTRAINT test_pk PRIMARY KEY(ID))AS SELECT deptno, dname, loc, 1 FROM scott.dept这里我们利用了Oracle的Sample的scott用户的表,把数据copy到我们的test表中。首先我们看一下for update锁定方式。首先我们执行如下的select for update语句。select * from test where id = 10 for update通过这条检索语句锁定以后,再开另外一个sql*plus窗口进行操作,再把上面这条sql语句执行一便,你会发现sqlplus好像死在那里了,好像检索不到数据的样子,但是也不返回任何结果,就属于卡在那里的感觉。这个时候是什么原因呢,就是一开始的第一个Session中的select for update语句把数据锁定住了。由于这里锁定的机制是wait的状态(只要不表示nowait 那就是wait),所以第二个Session(也就是卡住的那个sql*plus)中当前这个检索就处于等待状态。当第一个session最后commit或者rollback之后,第二个session中的检索结果就是自动跳出来,并且也把数据锁定住。不过如果你第二个session中你的检索语句如下所示。select * from test where id = 10也就是没有for update这种锁定数据的语句的话,就不会造成阻塞了。另外一种情况,就是当数据库数据被锁定的时候,也就是执行刚才for update那条sql以后,我们在另外一个session中执行for update nowait后又是什么样呢。比如如下的sql语句。由于这条语句中是制定采用nowait

Oracle的事务及锁

1、事务的概念: 事务是一个基本的逻辑单元,它作为一个整体要么全部执行要么全部不执行。 2、事务的特性: 原子性:事务是处理的一个原子单位,每一个操作不可拆分,它要么全部执行成功,要么全部都不执行。 一致性:指事务完成时,必须使所有的数据在整体上不变。 隔离性:各事务之间相互隔离,此事务的执行不受其他并发事务执行的干扰。 持续性:指事务对数据库的改变应是持续存在的,不会因故障而发生丢失。 3、从功能是上划分,sql语言分为DDL、DML和DCL: 3.1DDL(Data Definition Language,数据定义语言): 用于定义和管理数据库中的所有对象的语言,如:create创建表空间、alter修改表空间、drop 删除表空间 3.2:DML(Data manipulation Language,数据操作语言): 处理数据等操作,如:insert插入数据、delete删除数据、update修改数据、select查询数据3.3:DCL(Data Control Language,数据控制语言): 授予或回收访问数据库的权限,控制数据库操作事务发生的时间及效果,对数据库实行监视,如:grant授权,rollback回滚,commit提交 4、事务的开始及结束: 一个事务可以由一条DDL语句单独组成或多条DML语句共同组成。一个事务从执行第一条sql语句开始,在它被提交或被回滚时结束。事务的提交可以是显式提交:用commit命令直接完成;也可以是提交隐式提交:用sql语句间接完成提交,这些语句有:alter,audit,comment,create,disconnect,drop,exit,grant,noaudit,quit,revoke,rename,会话终止等;还可以是自动提交:set autocommit on或set autocommit immediate设置为自动提交,则在插入、删除、修改语句执行后自动提交,使用set autocommit off可以取消自动提交,show autocommit可以查看自动提交是否打开。事务的回滚使用rollback;语句,可以为事务设置保存点,如:savepoint point1,然后使用rollback to [savepoint] point1回到保存点point1,若在point1后又设置了一个保存点savepoint point2,则在rollback to point1后将不能再回滚到point2,因为point2在point1的后面,point1的保存点不存在point2。 5、事务的并发性与一致性: 并发性:多个用户可以在同一时刻访问相同的数据。 一致性:保证并发性的同时,每个用户能得到一致的数据视图。 并发执行事务时,可能发生如下情况: ①脏读:某个事务读取了其他未提交事务修改过的数据。 脏读示例:提交读隔离级别可防止脏读,但不能防止不可重复读 ②不可重复读:某个事务读取一次数据后,其他事务修改了这些数据并进行了提交,这样当该事务重新读取这些数据时,就会得到与前一次读取不一致的结果。简单的说,就是同样的条件,你读取过的数据,再次读取时发现值不一样了。 不可重复读示例:可重复读隔离级别可防止脏读和不可重复读

ORACLE数据库用户与权限管理

ORACLE数据库用户与权限管理ORACLE是多用户系统,它允许许多用户共享系统资源。为了保证数据库系统的安全,数据库管理系统配置了良好的安全机制。 2.1 ORACLE数据库安全策略 建立系统级的安全保证 系统级特权是通过授予用户系统级的权利来实现,系统级的权利(系统特权)包括:建立表空间、建立用户、修改用户的权利、删除用户等。系统特权可授予用户,也可以随时回收。ORACLE系统特权有80多种。 建立对象级的安全保证 对象级特权通过授予用户对数据库中特定的表、视图、序列等进行操作(查询、增、删改)的权利来实现。 建立用户级的安全保证 用户级安全保障通过用户口令和角色机制(一组权利)来实现。引入角色机制的目的是简化对用户的授权与管理。做法是把用户按照其功能分组,为每个用户建立角色,然后把角色分配给用户,具有同样角色的用户有相同的特权。 2.2 用户管理 ORACLE用户管理的内容主要包括用户的建立、修改和删除用户的建立

2.3系统特权管理与控制 ORACLE 提供了80多种系统特权,其中每一个系统特权允许用户执行一个或一类数据库操作。 授予系统特权 回收系统特权 显示已被授予的系统特权(某用户的系统级特权) 2.4 对象特权管理与控制 ORACLE对象特权指用户在指定的表上进行特殊操作的权利。这些特殊操作包括增、删、改、查看、执行(存储过程)、引用(其它表字段作为外键)、索引等。 授予对象特权

//级联授权 回收对象特权 显示已被授予的全部对象特权 2.5 角色的管理 ORACLE的角色是命名的相关特权组(包括系统特权与对象特权),ORACLE用它来简化特权管理,可把它授予用户或其它角色。 ORACLE数据库系统预先定义了CONNECT 、RESOURCE、 DBA、 EXP_FULL_DATABASE、IMP_FULL_DATABASE五个角色。CONNECT具有创建表、视图、序列等特权;RESOURCE具有创建过程、触发器、表、序列等特权、DBA具有全部系统特权;EXP_FULL_DATABASE、 IMP_FULL_DATABASE具有卸出与装入数据库的特权。 通过查询sys.dba_sys_privs可以了解每种角色拥有的权利。 授予用户角色

oracle的TM锁T锁知识完全普及

o r a c l e的T M锁T锁知 识完全普及 集团标准化办公室:[VV986T-J682P28-JP266L8-68PNN]

oracle的TM锁、TX锁知识完全普及 锁概念基础 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。 Oracle数据库的锁类型 根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。 DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。 当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM 锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。 在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。 当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

oracle hr解锁和加密

Oracle解锁与加锁(hr用户为例) [oracle@jieshi9i ~]$ sqlplus /nolog SQL*Plus: Release 9.2.0.4.0 - Production on Tue Jul 14 18:12:38 2009 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. SQL> conn sys/sys as sysdba Connected. SQL> show user USER is "SYS" SQL> desc dba_users Name Null? Type ----------------------------------------- -------- ---------------------------- USERNAME NOT NULL VARCHAR2(30) USER_ID NOT NULL NUMBER PASSWORD VARCHAR2(30) ACCOUNT_STATUS NOT NULL VARCHAR2(32) LOCK_DATE DATE EXPIRY_DATE DATE DEFAULT_TABLESPACE NOT NULL VARCHAR2(30) TEMPORARY_TABLESPACE NOT NULL VARCHAR2(30) CREATED NOT NULL DATE PROFILE NOT NULL VARCHAR2(30) INITIAL_RSRC_CONSUMER_GROUP VARCHAR2(30) EXTERNAL_NAME VARCHAR2(4000)

JAVA中锁概及运用

一、锁的概念及分类 ORACLE数据库是现今数据库领域应用最广泛的,同时它也是一个庞大的系统,全面了解它、玩转它不但需要一定的理论知识,更需要开发经验与工程经验。本人是ORACLE一爱好者,以下是本人对ORACLE锁的一些经验,希望能与大家共同分享。 ORACLE锁具体分为以下几类: 1.按用户与系统划分,可以分为自动锁与显示锁 自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。 显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。 2.按锁级别划分,可分为共享锁、共享更新锁、排它锁 共享锁:共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁。共享锁为事务提供高并发性,但如拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。 ―锁定表 ―仅允许其他用户执行查询操作 ―不能插入、更新和删除 ―多个用户可以同时在同一表中放置此锁 ―lock tab le table_name ―in share mode [nowait]; ― rollback 和commit 命令释放锁 ― nowait 关键字告诉其他用户不用等 共享更新锁 ―锁定要被更新的行 ―允许其他用户同时查询、插入、更新未被锁定的行 ―在 SELECT 语句中使用“FOR UPDATE”子句,可以强制使用共享更新锁 ―允许多个用户同时锁定表的不同行 加锁的两种方法 1 lock table tab_name in share update mode; 2 select column1,column2 from goods where goods where gid=1001 for update of column1,column2

ORACLE账户解锁定的方法

ORACLE账户锁定解决办法如果数据库中某个账户登录时,提示被锁定 则如果想使用此账户登录时,解决办法参考下文。 ●操作系统版本为: Microsoft Windows[版本5.2.3790] (C) 版权所有1985-2003 Microsoft Corp. ●解决方法: C:\Documents and Settings\Administrator>sqlplus /nolog SQL*Plus: Release 10.2.0.1.0 - Production on 星期三6月24 10:43:39 2009 Copyright (c) 1982, 2005, Oracle. All rights reserved. SQL> conn /as sysdba 已连接。 SQL> alter user system account unlock; 用户已更改。 SQL> exit 从OracleDatabase 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options 断开 C:\Documents and Settings\Administrator>sqlplus SQL*Plus: Release 10.2.0.1.0 - Production on 星期三6月24 10:45:26 2009 Copyright (c) 1982, 2005, Oracle. All rights reserved. 请输入用户名: system

Oracle中锁的产生和解锁

Oracle中锁的产品和解锁 文档修改记录 版本号日期说明编写者审核者V1.0 20110822 初稿周伟明 1Oracle锁的介绍 在多进程或者多线程业务系统中,多个Oracle用户可以同时登录到一个Oracle数据库,对数据库中的数据进行操作难免会出现同时访问同一数据(表或者表中某一条记录)的情况,如果不对这种情况进行规范操作,数据的一致性和完整性就得不到保证,从而会出现意想不到的结果,所以必须有一种机制对并发访问进行控制和调度,避免造成数据更新不正确。 Oracle锁就是这样一种机制,它是控制并发操作最常用的方法。Oracle使用锁来防止进程相互之间发生的破坏性影响,当一个进程企图阻止另外一个进程对某条数据操作时,该进程就对这个数据进行锁,别的进程对这个数据操作之前,必须获得这个数据的解锁。 Oracle锁功能是Oracle DBMS自动完成的,不需要用户干预,但Oracle也提供了加锁的命令,供用户使用。 1.1 Oracle锁机制 Oracle自动使用不同锁类型来控制数据的并发操作,以防止用户之间的破坏性干扰。Oracle为一个事务自动锁一个资源,以防止其他事务对同一个资源的排他锁。当某种条件出现或者事务不再需要该资源时,锁自动解除。Oracle自动获取不同类型的锁取决于锁的资源及其所执行的操作。其中包括数据锁(DML)、字典锁(DDL)、内部锁、人工锁定、分布锁和并行缓冲管理锁。

1.1.1数据锁(DML)模式 数据锁保证表中数据在多个用户并发操作数据时保证数据的完整性,并防止相冲突的DML和DDL操作的破坏性干扰。 DML操作可在两个级别获取数据锁:行级锁(TX)和表级锁(TM)。 表级锁有以下几种方式 ●空 Null,即无锁。 ●行共享表锁(RS) 行共享表锁(有时也叫SS),表明事务保持已锁表行的表锁,并试图修改数据。 这种锁是在执行以下命令的时自动获取: Select …From 表名… for update for …; Lock Table 表名 in Row Share Mode; 当一个事务在一个表持有行共享锁的时候,允许其他事务并行查询、插入、修改或 者删除及再进行行锁,但禁止其他事务以排他方式进行操作该表。 Lock Table 表名 in Exclusive Mode; ●行排他表锁(RX) 行排他表锁(有时也叫SX)表示该事务对该资源有独占权利,通常是在修改记录 时发生这种锁。 该锁在执行以下命令的时候自动获取: Insert Into 表名…; Update 表名…; Delete From 表名…; Lock Table 表名 In Row Exclusive Mode; 当一个事务在一个表上持有行排他锁时,允许其他事务并行查询、插入、删除、修 改或者锁同一个表的其他行,但禁止其他事务使用下列命令进行并发锁: Lock Table 表名 In Share Mode; Lock Table 表名 In Share Row Exclusive Mode; Lock Table 表名 In Exclusive Mode; ●共享表锁(S)

oracle的TM锁TX锁知识完全普及

o r a c l e的T M锁T X锁 知识完全普及 Hessen was revised in January 2021

oracle的TM锁、TX锁知识完全普及 锁概念基础 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。 Oracle数据库的锁类型 根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。 DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。 当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM 锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。 在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。 当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

oracle的tm锁t锁知识完全普及

oracle的TM锁、TX锁知识完全普及 锁概念基础 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。 Oracle数据库的锁类型 根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。 DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML 锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。 当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。 在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。 当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生

Oracle用户角色权限等操作

oracle 赋予权限 转发评论 02月21日13:00 最基础的sqlplus username/password@[sid] 连接数据库 sqlplus username/password as sysdba 以管理员连接数据库 管理员连接后创建用户sqlplus system/manager@demo as sysdba create user abc identified by abc ; 创建用户abc密码为abc grant all privileges to abc; 给abc用户赋予所有的权限 给自己留个备份以备不时之需 oracle grant 授权语句--select * from dba_users; 查询数据库中的所有用户 --alter user USERNAME account lock; 锁住用户 --alter user USERNAME account unlock; 给用户解锁 --create user USERNAME identified by USERPASS; 建立用户 一般创建用户后需要授予链接数据库权限 grant connect,resource to USERNAME; --grant create tablespace to USERNAME; 授权创建表空间 --grant SELECT on TABLENAME to USERNAME; 授权查询 授权其他动作格式相同 如果要把所有表的查询权限分配给用户可以用这样的 grant select any table to USERNAME; --grant execute on procedure1 to xujin 授权存储过程

数据库中的锁

数据库锁的基本概念 为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(Exclusive locks记为X锁)和共享锁(Share locks记为S锁)。 排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。共享锁:若事务T对数据D加S锁,则其它事务只能对D加S锁,而不能加X锁,直至T 释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。 2 Oracle 多粒度封锁机制介绍 根据保护对象的不同,Oracle数据库锁可以分为以下几大类: (1) DML lock(data locks,数据锁):用于保护数据的完整性; (2) DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义); (3) internal locks 和l a t c h es(内部锁与闩):保护内部数据库结构; (4) distributed locks(分布式锁):用于OPS(并行服务器)中; (5) PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。 本文主要讨论DML(也可称为data locks,数据锁)锁。从封锁粒度(封锁对象的大小)的角度看,Oracle DML锁共有两个层次,即行级锁和表级锁。 2.1 Oracle的TX锁(行级锁、事务锁) 许多对Oracle不太了解的技术人员可能会以为每一个TX锁代表一条被封锁的数据行,其实不然。TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。所以,一个TX锁,可以对应多个被该事务锁定的数据行。 在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定。Oracle不象其它一些DBMS(数据库管理系统)那样,建立一个链表来维护每一行被加锁的数据,这样就大大减小了行级锁的维护开销,也在很大程度上避免了其它数据库系统使用行级封锁时经常发生的锁数量不够的情况。数据行上的锁标志一旦被置位,就表明该行数据被加X锁,Oracle在数据行上没有S锁。 2.2 TM锁(表级锁) 2.2.1 意向锁的引出 表是由行组成的,当我们向某个表加锁时,一方面需要检查该锁的申请是否与原有的表级锁相容;另一方面,还要检查该锁是否与表中的每一行上的锁相容。比如一个事务要在一个表上加S锁,如果表中的一行已被另外的事务加了X锁,那么该锁的申请也应被阻塞。如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。为了解决这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,这就引出了“意向锁”的概念。意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。如:对表中的任一行加锁时,必须先对它所在的表加意向锁,然后再对该行加锁。这样一来,事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统效率得以大大提高。 2.2.2 意向锁的类型 由两种基本的锁类型(S锁、X锁),可以自然地派生出两种意向锁: 意向共享锁(Intent Share Lock,简称IS锁):如果要对一个数据库对象加S锁,首先要对其上级结点加IS锁,表示它的后裔结点拟(意向)加S锁;

相关文档
相关文档 最新文档