您的位置:首页 > 其它

事务的隔离级别解析

2015-07-31 22:22 253 查看
在正式讨论我们的问题之前,先让我们来回想一下,什么是事务?

1.事务

所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

2.事务的特性:

【1】原子性:强调事务是一个整体,要么都执行,要不都不执行。

【2】一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态,强调数据的一致性。

【3】隔离性:指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被企图 进行修改的事务看到。

【4】持久性:意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。

3.如果不考虑事务隔离性会引发的问题:

【1】脏读:一个事务读到另一个事务未提交的数据。

说明:小明去银行取钱,读取到卡里有100元,然后小明将100元取出,但是数据还没有提交到数据库中; 这个时候小红拿着同一张卡去取钱,因为小明的取出的100元还没有被写到数据库,小红读到的还是100 元,小红读到的就是小明没有提交的数据,这就是脏读。

【2】不可重复读:一个事务读到另一个事务已提交的数据,强调Update。

说明:有一个学生信息表,里面有一条数据[小明
男 25岁];事务1现在读取这个条数据,将“小明”修改 为“张三”,但是还没有提交到数据库中;这个时候事务2来进行对这条数据的操作,事务2需要两次读取 这条数据,事务2第一次读取数据是在事务1还没有提交的时候,读出的数据依然是[小明
男 25岁],但是 事务2在第二次读取的时候,小明已经提交了,这个时候同样的读取操作结果确实[张三 男 25岁],事务2 两次读取的结果不一致,这就是不可重复读问题。

【3】虚度/幻读:一个事务读到另一个事务已提交的数据,强调Insert。

【4】丢失更新: 两个事务同时修改数据,后提交事务覆盖了先提交事务的结果。

4.解决隔离性问题的方案:

前三个问题的解决方案:



【1】readuncommitted 读未提交,一个事务读到另一个事务未提交的数据,存在3个问题。

【2】readcommitted 读已提交,一个事务读到另一个事务已提交的数据,解决:脏读、存在:2个问题

【3】repeatableread 可重复读。在一个事务中,读到的数据重复的。解决:脏读、不可重复读,存在:1个问题

【4】serializable串行化。单事务。

第四个问题的解决方案:

【1】乐观锁

【2】悲观锁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: