比较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