首页 > 编程知识 正文

数据库隔离级别怎么实现的,mysql数据库隔离级别

时间:2023-05-04 00:22:15 阅读:47185 作者:691

一谈到事务隔离水平,开发的同学都可以说同样的话。 肮脏的读法、不可重复的读法、RC、RR .等常用术语也大致知道意思。 但是,制作技术,严格和纤细是很重要的。 如果对事务隔离级别的认识仅停留在众所周知的程度,则数据库核心开发人员可能会开发对用户来说难以理解的隔离级别表示,业务开发人员可能会从数据库中检测到与预期不同的结果。

那么,你如何判断自己是否深入了解了事务隔离水平? 开发的同学可以问自己这样两个问题。 (1)事务隔离水平可分为几类? 各自能解决什么问题? 有明确的定义吗? 这样的定义正确吗? )2)当前主流数据库(Oracle/MySQL . )的隔离级别表现和实现是什么? 与“公式”的定义一致吗?

如果能明确回答这两个问题,恭喜你。 你对事务隔离水平有非常深刻的认识。 如果做不到的话,没关系。 读了正文后会得出答案。

1 .事务隔离级别

事务隔离级别,主要保障关系dirty read : SQL-transaction t1 modifies arow.SQL-transaction T2 thenreadsthatrowbeforet1performsacacomion T2 willhavereadarowthatwasnevercommittedandthatmaythusbeconsideredtohaveneverexisted。

非可修复读取: SQL-transaction t1 reads arow.SQL-transaction T2 thenmodifiesordeletesthatrowandperformsacommit.if itmayreceivethemodifiedvalueordiscoverthattherowhasbeendeleted。

phantom : SQL-transaction t1 readsthesetofrowsnthatsatisfysome.SQL-transaction T2 thenexecutessql-statementststhatgenenerate action t1.if SQL-transaction t1 thenrepeatstheinitialreadwiththesame,itobtainsadifferentcoome

讨厌上述定义冗长,可以直接看到以下形式化描述: a1 dirty read:w1 [ x ] . R2 [ x ] . (a1 and C2 inanyorder )。

a2 fuzzy read:R1 [ x ] . w2 [ x ] . C2 . R1 [ x ] . C1

a3 phantom read:R1 [ p ] . w2 [ yinp ] . C2 . R1 [ p ] . C1

其中w1[x]指示事务1正在写入记录x,r1指示事务1正在读取记录x,c1指示事务1已提交,a1指示事务1正在回滚表示事务1根据谓词p的条件读取多个记录,w1[y in P]表示事务1写入记录y满足谓词p的条件。

由此,ANSI定义了4种隔离级别,分别解决了上述3种异常:

根据这几个异常现象定义隔离级别可以说并不严格,但Jim Gray著名论文acritiqueofansisqlisolationlevels (稍后简称critique )对此进行了批评。

不严格之一:禁止了P1/P2/P3的事务,即满足了序列化级别。 但是,ANSI标准规定,序列化级别为“多个并发事务执行的效果等效于某种序列化执行的效果”。 这两者明显矛盾,禁止P1/P2/P3事务不一定“等效于某种串行执行”。 因此,Critique将禁止ANSI定义的P1/P2/P3的隔离水平称为Anomaly Serializable。

不严密之二:异常现象定义不准确,以下范例虽未涵盖在A1,但dirtyread(txn2读作x y!=100 )。 同样,A2/A3也可以举出这样的例子。 感兴趣的同学可以自己列举一下。 这里不详细说明。

原因是,ANSI对幻像的定义过于严格,如果只保留关键并发事务之间的读写操作顺序(不包括对事务提交、回滚和数据查询范围的要求),则P1 dirty read 3360 w1 [ x ] .

p2 fuzzy read : R1 [ x ] . w2 [ x ] . (c1ora1)

P3 phantom : R1 [ p ] . w2 [ yinp ] . (c1ora1)

不严格之三: 3个幻像仅面向s (英) v (全)系统,足以定义m (美) v (埃)系统的隔离性。 许多业务数据库实现的SI并未违反P1、P2和P3,但可能会发生Constraint violation,无法序列化。 除了P1/P2/P3以外,还可能发生什么异常? P4丢失更新: R1 [ x ] . w2 [ x ] . w1 [ x ] . C1

a5 areadskew:R1 [ x ]…w2 [ x ]…w2 [ y ]…C2…R1 [ y ]…(c1ora1)

a5 bwriteskew:R1 [ x ] . R2 [ y ] . w1 [ y ] . w2 [ x ] . (C1 and C2 occur )

a5 B2写入方案2:R1 [ p ] . R2 [ p ] . w1 [ yinp ] . w2 [ xinp ] . (C1 and C2 occur )

对于这四种情况,分别列举一个例子: R1 [ x=50 ] R2 [ x=50 ] w2 [ x=60 ] C2 w1 [ x=70 ] C1

Lost Update:事务处理1和事务处理2同时向同一帐户x分别充入20和10个块,在事务处理1之后提交,将70个块写入数据库,事务处理2的提交结果为60个块如果正确,事务1和2成功提交,账户上应该有80元。 [ xy=100 ] R1 [ x=50 ] w2 [ x=10 ] w2 [ y=90 ] C2 R1 [ y=90 ] C1 ]

Read Skew: x和y账户各有50元,合100元。 事务1读完x(50元)后,事务2将x账户的40元转移到y账户,事务2提交后,事务1读y ) 90元。 从事务1来看,x y=140,出现了不一致。 (x y=60 ) R1(x=50 ) R2 ) x y=60 ) W1 ) x y=60 ) C1W2 ) x y=60 ) C2

Write Skew:x和y账户各有50元,一共100元。 假设有某种约束,x和y账户的钱加起来不得少于60元。 如果事务1和事务2认为不违反约束(分别阅读了x和y账户),则从y账户和x账户分别取40。 但实际上,这两个事务完成后,x y=20将破坏约束。 [count(p )=4]:R1[count ) ]=3],r2[count(P )=3],insert1[x in P],insert2[y in P],c1,c2,

写入方案2 :将写入方案的条件更改为范围。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。