比较MSSQL和Oracle数据库的事务隔离级别和锁机制

首先,交易的4个基本特征

Atomic(原子性):

事务中包含的操作被视为一个逻辑单元,并且此逻辑单元中的操作是必需的。

所有的成功,或所有的失败。

一致性(一致性):

只有合法数据才能写入数据库,否则事务应该将其滚回到原来的数据库中。

状态。

隔离(隔离):

事务允许多个用户并发访问同一数据而不破坏正数据。

同时,并行事务的修改必须与其他并行事务一起进行修改。

相互独立。

耐久性(持久性):

事务结束后,事务处理的结果必须能够被治愈。

以上是废话

二,为什么需要控制事务并发性

如果事务不并发控制,我们可以看到数据库并发操作将具有这些异常。

丢失更新:

这两个事务同时更新一行数据,但第二个事务在中间失败。

对数据的两次修改失败了。

脏读:

事务开始读取一行数据,但另一事务已更新了该数。

但是它不能及时提交,这是很危险的,因为所有操作都是可能的。

全都滚回来了。

不可重复读:

事务重复读取同一行数据两次,但得到不同的结果。

第二个丢失更新问题:

不能重复读取的特殊情况。有两个并发事务同时读取同一行数据,然后

其中一个被修改提交,另一个被修改提交。

第一次写入操作失败。

幻读:

事务在操作期间执行两个查询,第二个查询的结果包含第一个检查。

查询中没有出现的数据(这对两个查询不需要相同的SQL语句)。

因为在这两个查询中插入了另一个事务。

三,数据库的隔离级别

为了考虑并发效率和异常控制,在标准SQL规范中定义了4个事务性障碍。

平整,(Oracle和sqlserer有标准的隔离级别不同的实现)

未提交读:

直译是读取未提交的

事务可以读取更改。这很不安全。

提交读:

直译是读提交

其他的东西可以阅读变化。

可重复读:

直译是重复阅读。

当您查询语句时,结果是相同的。

Serializable:

直译是序列化。

并行执行。

四,隔离级别并发性的控制

下表是每个隔离级别控制各种异常的能力。

吕博士NRR SLU PR

你是谁

钢筋混凝土结构

n,n,n,n,y

n,n,n,n

(注:路:丢失更新;医生:脏读;NRR:非重复阅读;州两类更新丢失;公关:幻想)

顺便提一下,一个小例子。

ms_sql:




-业务
设置一个事务的隔离级别
事务的开始
插入测试值('xxx)

商务两
设置事务隔离级别
事务的开始
从测试中选择*

商务三
设置事务隔离级别
事务的开始
从测试中选择*




事务完成后,一个在查询分析器中执行,事务二和三分别执行,结果是事务二将等待,事务三将被执行。

神谕:




-业务
设置一个事务的隔离级别;
插入测试值('xxx);
从测试中选择*;

商务两
设置事务隔离级别读提交——Oracle默认级别
从测试中选择*




事务执行后,执行事务2,结果是事务2读取原始数据,忽略事务的插入操作。

有读者发现ms_sql和Oracle有不同的处理并发控制

五、锁

下表是锁的兼容性或冲突情况。

现有süx

请求

是什么意思

铀氮

x n n

现有süx

应用

是什么意思

铀氮

x n n

神谕:





六、注意点



一般处理并发问题的步骤:

1。打开事务。

2。申请写入权限,即锁定对象(表或记录)。

3、如果失败,交易结束后重试一段时间。

4,如果成功,它是成功锁定对象,阻止其他用户以同样的方式打开。

5,编辑操作。

6,编写编辑结果。

7。如果写入成功,则提交事务并完成操作。

8,如果写失败,事务将回滚,提交将被取消。

9,(7.8)两步操作释放锁定对象并在操作之前恢复到状态。



多表操作最好实现锁定,或保证处理顺序;个人感觉好,虽然有些低效。

七、附

查看锁定

神谕:




选择object_name,session_id,os_user_name,oracle_username,过程,locked_mode,地位
从V locked_object美元,all_objects一
在l.object_id = a.object_id;



ms_sql:


执行sp_lock