MSSQL与Oracle数据库事务隔离级别与锁机制对比
一,事务的4个基本特征
Atomic(原子性)
事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要
么全部成功,要么全部失败。
Consistency(一致性)
只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初
状态。
Isolation(隔离性)
事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正
确性和完整性。,并行事务的修改必须与其他并行事务的修改
相互独立。
Durability(持久性)
事务结束后,事务处理的结果必须能够得到固化。
以上属于废话
二,为什么需要对事务并发控制
如果不对事务进行并发控制,我们看看数据库并发操作是会有那些异常情形
Lost update
两个事务都更新一行数据,第二个事务却中途失败退出,
导致对数据的两个修改都失效了。
Dirty Reads
一个事务开始读取了某行数据,一个事务已经更新了此数
据但没有能够及时提交。这是相当危险的,因为很可能所有的操作
都被回滚。
Non-repeatable Reads
一个事务对同一行数据重复读取两次,却得到了不同的结果。
Second lost updates problem
无法重复读取的特例。有两个并发事务读取同一行数据,然后其
中一个对它进行修改提交,而另一个也进行了修改提交。这就会造成
第一次写操作失效。
Phantom Reads
事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查
询中未出现的数据(这里并不要求两次查询的SQL语句相同)。这是
因为在两次查询过程中有一个事务插入数据造成的。
三, 数据库的隔离级别
为了兼顾并发效率和异常控制,在标准SQL规范中,定义了4个事务隔
离级别,(ORACLE和SQLSERER对标准隔离级别有不同的实现 )
Read Unmitted
直译就是"读未提交",意思就是即使一个更新语句没有提交,别
的事务可以读到这个改变.这是很不安全的.
Read Committed
直译就是"读提交",意思就是语句提交以后即执行了COMMIT以后
别的事务就能读到这个改变.
Repeatable Read
直译就是"可以重复读",这是说在同一个事务里面先后执行同一个
查询语句的时候,得到的结果是一样的.
Serializable:
直译就是"序列化",意思是说这个事务执行的时候不允许别的事务
并发执行.
四,隔离级别对并发的控制
下表是各隔离级别对各种异常的控制能力。
LU DR NRR SLU PR
RU Y Y Y Y Y
RC N N Y Y Y
RR N N N N Y
S N N N N N
(注LU丢失更新;DR脏读;NRR非重复读;SLU二类丢失更新;PR幻像读)
顺便举一小例。
MS_SQL:
--事务一 set transaction isolation level serializable begin tran insert into test values('xxx') --事务二 set transaction isolation level read mitted begin tran select from test --事务三 set transaction isolation level read unmitted begin tran select from test
在查询分析器中执行事务一后,分别执行事务二,和三。结果是事务二会等待,而事务三则会执行。
ORACLE
--事务一 set transaction isolation level serializable; insert into test values('xxx'); select from test; --事务二 set transaction isolation level read mitted--ORACLE默认级别 select from test
执行事务一后,执行事务二。结果是事务二只读出原有的数据,无视事务一的插入操作。
读者是否发现MS_SQL和ORACLE对并发控制的处理有所不同呢?
五,锁
下表是锁的兼容或冲突情形。
现有 S U X
请求
S Y Y N
U Y N N
X N N N
现有 S U X
申请
S Y Y N
U Y N N
X N N N
oracle:
六,注意点
一般处理并发问题时的步骤
1、开启事务。
2、申请写权限,也就是给对象(表或记录)加锁。
3、假如失败,则结束事务,过一会重试。
4、假如成功,也就是给对象加锁成功,防止其他用户再用同样的方式打开。
5、进行编辑操作。
6、写入所进行的编辑结果。
7、假如写入成功,则提交事务,完成操作。
8、假如写入失败,则回滚事务,取消提交。
9、(7.8)两步操作已释放了锁定的对象,恢复到操作前的状态。
对多表的操作最好一起取得锁,或则保证处理顺序;个人感觉还是前者好,虽然效率低一些
七,附
查看锁
ORACLE
select object_name,session_id,os_user_name,oracle_username,process,locked_mode,status from v$locked_object l, all_objects a where l.object_id=a.object_id;
MS_SQL
EXEC SP_LOCK
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程