数据库隔离层次

上传人:ba****u6 文档编号:230312491 上传时间:2023-08-23 格式:DOCX 页数:12 大小:36.38KB
收藏 版权申诉 举报 下载
数据库隔离层次_第1页
第1页 / 共12页
数据库隔离层次_第2页
第2页 / 共12页
数据库隔离层次_第3页
第3页 / 共12页
资源描述:

《数据库隔离层次》由会员分享,可在线阅读,更多相关《数据库隔离层次(12页珍藏版)》请在装配图网上搜索。

1、SQL标准定义了4类隔离级别,包括了一些具体规则,用來限定事务内 外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更 高的并发处理,并拥有更低的系统开销。Read Uncommitted (读取未提交内容)在该隔离级别,所有事务都可以看到其他未提交事务的执行结 果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多 少。读取未提交的数据,也被称之为脏读(DirtyRead)。Read Committed (读取提交内容)这是大多数数据库系统的默认隔离级别(但不是MySQL默认 的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做 的改变。这种隔离级别 也支持所谓的

2、不可重复读(Nom-epeatable Read), 因为同一事务的其他实例在该实例处理其间可能会有新的commit,所 以同一 select可能返回不同结杲。Repeatable Read (可重读)这是MySQL的默认事务隔离级别,它确保同一事务的多个实 例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另 一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读 取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户 再读取该范围的数据行时,会发现有新的“幻影”行。IimoDB和Falcon 存储引擎通过多版本并发控制(MVCC, Multiversi

3、on Concunency Contiol)机制解决了该问题。Serializable (可串行化)这是最高的隔离级别,它通过强制事务排序,使之不可能相互 冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享 锁。在这个级别,可能导致大量的超时现象和锁竞争。这四种隔离级别采取不同的锁类型來实现,若读取的是同一个 数据的话,就容易发生问题。例如:脏读(DrityRead):某个事务己更新一份数据,另一个事务在此 时读取了同一份数据,由于某些原因,前一个RollBack 了操作,则后 一个事务所读取的数据就会是不正确的。不可重复读(Non-repeatable read):个事务的两次查

4、询之中数 据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数 据。幻读(Phantom Read):在一个事务的两次查询中数据笔数不一 致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插 入了新的几列数据,先前的事务在接下來的查询中,就会发现有几列数 据是它先前所没有的。在MySQL中,实现了这四种隔离级别,分别有可能产生问题如卞所示:隔离级别脏读不可重复读幻读读未提交(Readuncommitted)VVV读已提交(Readcommitted)XVV可重复读(Repeatableread)XXV可串行化(Serializable)XXX下面,将利用MySQL的客户

5、端程序,分别测试几种隔离级别。测试数 据库为test,表为tx;表结构:idintnumint两个命令行客户端分别为A, B;不断改变A的隔离级别,在B端修改 数据。(一)、将A的隔离级别设置为read uncommitted(未提交读)在B未更新数据之前:客户端use test;Database changednysql select (?(?tx_isolat ion ;十.i GPtx_isolat ion !十4-:READ-UNCOMMITTED !+1 row in set mysql start transaction;Query OK. 0 rov/s affected sel

6、ect * from tx;*-411id1nuna i-a i1a i1a i2i i2e i i3i i3e i+ 一f fp rows in set B更新数据:客户端B:mysql update tx set nun=10 where id=l;Query OK. 1 rov/ affected Rows matched: 1 Changed: 1Warnings: 0nysql薈* select * from tx;! id !nun i*! 1 !10 ! 2 !2 !3 !3 !薈-3 rowsin set mysqlrollback;Query (0 rows affected

7、 nysqlselect * from tx;4 4-.! id !nun i 一 -.! 1 !1 ! 2 !2 !3 :3 !-薈客户端A:mysql select * from tx;-11id1 Inun 04111111111121211 a3113114一f3 rows in set nysql select * from tx;! id !nun i4-:1 :10 !:2 !2 !:3 !3 ! 3 rowsin set mysqlselect * from tx;.! id !nun i! 1 :1 !;2 !2 !:3 ;3 !经过上面的实验可以得出结论,事务B更新了一条记

8、录,但是 没有提交,此时事务A可以查询出未提交记录。造成脏读现象。未提交 读是最低的隔离级别。(二)、将客户端A的事务隔离级别设置为read committed(已提交读)在B未更新数据之前:客户端A:hysql use test; Database changed riysql select (?(?tx_isolat ion ;i PPtx.isolat ion ! READ-COMMITTED !1 row in set lnysql start transaction ;Wuery OK. 0 rows affected nysql select * from tx;1-4-11idi

9、 nunI li-111i 111112i 2I a113i i3I II-4-3 rov/s in set B更新数据:客户端B:hysql start transaction;Query OK, 0 rows affected nysql update tx set nun=10 where id=l; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0pysql select * from tx;-十! idiinun i.-+! 1I i10 ! 2i i2 :5 3a i-3 !+rows in set ys

10、ql commit;uery OK, 0 rows affected nysql select * from tx;id i nun3 rows in setmysql select * from tx;id ! nun1:10:2 !2:3 :3:3 rovis in set经过上面的实验可以得出结论,已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的数据不一致,因为在两次查询之间事务B更新了一条数据。已提交读只允许读取已提交的记录,但不要求可重复读。、将A的隔离级别设置为repeatable read(可重复读)在B未更新数据之前:客户端hysql sele

11、ct PGtx.isolation; P(?t x_iso lat ion !.! REPEATABLE-READ !*+1 row in set r) start transaction ;Query OK, 0 rows affected hysql select * from tx;*-4- id1 anun -:11111 a;2121! 31131 e4-f3 rov/s in set B更新数据:客户端B:transaction; rows affectedriysql update tx set nun=10 where id=l ; Query OK, 1 row affect

12、ed Bovis matched: 1 Changed: 1 Warnings: 0hysql selectfrom tx;1 !10 !2 !2 !3 3 J+rowsin set3hysql connit;Muery OK. 0 rows affected Lysqliysqlselectf rontx;+4.-4-! id !十令Inun ! 1 :1 !:2 !2 !3 !3 !4+ -十3 rowsin setnysqlselect餐f rontx;十1 id !nun i一一一善.十! 1 !1 ! 2 !2 !3 !3 !十-十3 rowsin setnysqlselectfro

13、mtx;*令-十! id !mm ! -V* ! 1 !1 ! 2 !2 !3 !3 !4-4-B插入数据:客户端B:mysqlselect* from tx;+! id !num i+4-! 1 !10 ! 2 !2 !3 ;3 !9 !4 :+-+4 rowsin setmysqlselect* from tx;4-4-! id :nun !+-.! 1 ;10 ! 2 !2 !3 !3 !9 !4 :4+ -4-客户端A:mysqlselect* fron tx;44-4-! id !nun i44-十! 1 !1 ! 2 !2 !3 :3 !4-+3 rowsin setnysqlco

14、mmit:IQuery OK. 0 rows affected mysqlselect* fron tx;+-4-! id ;nun i*4-4-! 1 !10 ! 2 !2 !3 ;3 !9 !* 一 令4 !-4-由以上的实验可以得出结论,可重复读隔离级别只允许读取己 提交记录,而且在一个事务两次读取一个记录期间,其他事务部的更新 该记录。但该事务不要求与其他 事务可串行化。例如,当一个事务可 以找到由一个已提交事务更新的记录,但是可能产生幻读问题(注意是可能,因为数据库对隔离级别的实现有所差别)。像以上的实验,就没 有出现数据幻读的问题。(四)、将A的隔离级别设置为 可串行化(Seria

15、lizable)A端打开事务,B端插入一条记录事务A端:事务B端:selection ;+*J P(?tx_iso lat ion i:REPEATABLE-READ !+备1 row in set nysql insert into txualue;因为此时事务A的隔离级别设置为serializable,开始事务后,并没有提 交,所以事务B只能等待。事务A提交事务:事务A端hysql connit;Query OK. 0 rows affected 事务B端mysql insertinto txualue;ERROR 1205 : Lock wait timeout exceeded; try restarting transaction mysqlserializable完全锁定字段,若一个事务來查询同一份数据就必 须等待,直到前一个事务完成并解除锁定为止。是完整的隔离级别,会 锁定对应的数据表格,因而会有效率的问题。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!