您的位置:首页 > 数据库 > Oracle

【Oracle学习】之 事务(Transaction)与锁

2017-04-18 16:42 274 查看
Q:创建空表后再插入记录,再回滚,记录没了,而表还存在?

A:看(下文)事务提交COMMIT

Topic1 :事务

Topic2:锁(exclusive,share锁)

一、事务概念

  定义:事务是一些数据库操作的集合。

特性:

  ①原子性(Atomicity):事务是数据库的逻辑工作单位,事务中的所有操作要么都做,要么都不做,不存在其他情况。



  ②一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态转变为另一个一致性状态,不存在中间的状态。



  ③隔离性(Isolation):数据库中一个事务的执行不受其他事务的干扰,每个事务都感觉不到还有其他事务在并发执行。



  ④持久性(Durability):一个事务一旦提交,则对数据库中数据的改变是永久性的,以后的操作或故障不会对事务的操作结果产生任何影响。



二、Oracle事务处理

(1)事务提交(COMMIT):

  ①显式操作方式:

sql statements
...

commit | rollback




  ②隐式操作方式:

(Ⅰ)利用语句可以设置事务是否自动提交

//事务的隐式管理方式
//on :开启事务自动提交;off:取消自动提交
set autocommit on/off




(Ⅱ)当发生以下事件时,事务将结束

⒈ 利用commit/rollback进行事务的提交和回滚

2. 执行DDL语句(create、alter、drop、rename、revoke等)时,事务将自动提交。详细查看:http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_1001.htm#SQLRF30041

3. 如果使用SQL*Plus,那么正常退出时,事务将会自动提交;而非正常退出时,则事务回滚。

(2)事务回滚(ROLLBACK):

(Ⅰ)取消全部操作

直接rollback

(Ⅱ)取消部分操作



insert into test_teacher (t_id, t_name) values (4, 'Gege');
insert into test_teacher (t_id, t_name) values (5, 'LAla');
savepoint A;
update test_teacher set t_name = 'Lala' where t_id = 5;
savepoint B;
insert into test_teacher (t_id, t_name) values (6, 'Miumiu');
rollback to B;
rollback to A;
rollback;




二、锁

oracle 资料:https://docs.oracle.com/cd/B19306_01/server.102/b14220/consist.htm

  定义:锁是在事务访问相同资源时,防止事务之间的有害性交互的机制,这些资源包括用户系统对象、内存和数据字典中的共享数据结构。

Q:为什么需要锁?

A:并发运行时,容易造成读取脏数据。

Q:并发大概分为?

A:①读并发(不会造成错误,如select),②写并发(容易造成错误,如insert、update、delete等等)

Q:锁什么时候释放?

A:事务结束。

常见的锁应用:

  两个客户端同时操作同一数据,一个进行操作,另一个进行等待。

//select 可以显式加锁
select * from test_teacher where t_id = 4 for update;










锁的分类:

①排他锁(exclusive):被称为写锁,该模式下的锁可以防止资源的共享,当进行数据修改时,会启用该类型的锁。



②共享锁(share):被称为读锁,该模式下的锁锁定的数据只能被读取,而不能被修改。加了共享锁的记录,允许被并发地读取。



  Oracle数据库大型数据库,它利用不同类型的锁来管理并发会话对数据对象的操作。oracle数据库中的锁按照所用对象的不同分为以下几种类型。

①DML锁:用来保护数据的完整性,称为数据锁。DML锁细分可以分为行级锁(TX)和表级锁(TM)。行级锁(TX)也属于排他锁。

②DDL锁:可以保护模式中对象的结构。

③内部锁:保护数据库的内部结构,完全自动调用。

死锁:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息