oracle事务的隔离级别和锁

原文地址:https://blog.csdn.net/zdp072/article/details/51100593/

1. 事务的特性(ACID):

(1) 原子性 Atomicity: 事务所包含的数据库操作要么都做,要么都不做

(2) 一致性 Consistency: 事务前后,所有的数据都保持一致的状态

例如:事务之前A,B两个账户的总和是10万(A: 4W, B: 6W), 现在A转账2W给B (A: 2W, B: 8W)

A, B账户总和依旧是10W,如果不是10W的话,则事务前后对于账户总和这种资源是不一致的。

(3) 隔离性 Isolation: 事务对数据的操作不能够受到其他事务的影响

(4) 持续性 Durability: 数据库事务一旦提交,其对数据库中数据的改变应该是永久性的


2. 事务的结束方式包括:

commit, rollback


3. 破坏事务ACID特性的因素包括:

(1) 多个事务并行运行,不同的操作交叉执行

(2) 事务在运行过程中被强行终止


4. 并发事务带来的问题:

数据库并发的事务会带来以下问题:

(1) 脏读:事务a修改数据时,事务b读取了该数据,但是事务a由于某种原因取消了对数据的修改,使数据返回了原状态,这时事务b读取的数据与数据库中的数据就会不一致。

(2) 不可重复读:事务a读取数据库中的数据后,事务b更新了该数据,当事务a再次读取该数据时,就会发现数据已经发生了改变

(3) 幻影读:事务a基于某个条件读取数据后,事务b在同一个表中插入了一条数据,这时事务a基于相同的条件再次读取数据时,返回了不同的行


5. 事务隔离级别

为了保证数据的一致性,一般采用了事务隔离机制,又称为事务串行化,用来保证事务尽量按照串行的方式执行

级别1:读取未提交,这种并发性最高,但会导致上述三个问题

级别2:读取已提交,这是oracle的默认隔离级别

级别3:可重复读

级别4:串行,这种隔离级别最高,但数据库并发会受到很大的限制,可以避免上述三个问题,但项目中不会采用

 

6. 数据库锁

数据库是一个多用户使用的共享资源,当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

加锁是实现数据库并发控制的一个非常重要的技术,当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁,加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

两种锁机制:

共享锁(S锁):加了共享锁的数据库对象可以被其他事务读取,但是不能被其他事务修改。

独占锁(X锁):加了独占锁的数据库对象不能被其他事务读取和修改。

commit或rollback后,事务所使用的锁被释放。


7. 数据库锁的类型:

(1) DML锁(data locks 数据锁):能够防止同步冲突的DML和DDL操作的破坏性,是oracle主要的锁,又包括表级锁(TM锁)和行级锁(TX锁)

当oracle执行DML语句的时候,系统自动在所要操作的表上申请TM类型的锁,当TM锁获得后,系统再自动申请TX类型的锁。

当多个会话在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态,当第一个会话提交后,TX锁会被释放,其他的会话才可以加锁。

当oracle数据库产生TX锁等待时,如果不及时处理常常会引起oracle数据库挂起或导致死锁的产生。


死锁:

当两个用户互相等待对方释放资源时,oracle认定为产生了死锁,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚。

例子:

用户1对A表进行update,没有提交

用户2对B表进行update,没有提交

如果用户2此时对A表做update,则会发生阻塞,需要等待用户1的事务结束

如果此时用户1对B表做update,则产生死锁,此时oracle会选择其中一个用户进行回滚,使另一个用户继续执行操作。


(2) DDL锁(dictionary locks字典锁): 用于保护数据库对象的结构,如表、索引的结构定义


问题:既然有了锁,为什么还要隔离级别?

事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制来解决并发问题。

锁是数据库并发控制的内部机制,是基础

对用户来说,只有当事务隔离级别无法解决一些并发问题和需求时,才有必要在语句中手动设置锁,不恰当的设置锁可能导致严重的阻塞和死锁。建议在完全了解锁机制的情况下,才可以再语句中手动设置锁,否则应该使用事务隔离级别。


http://sishuok.com/forum/blogPost/list/6366.html#22766

http://mousycoder.com/2016/02/19/explain-transaction-in-simple-language-3/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值