关于关系型数据库隔离级别实现方式的思考

mysql中提供了读未提交(read uncommitted 1级)、读已提交(read committed 2级)、可重复读(repeatable read 4级)、串行化(serializable 8级)四种隔离级别的选择;

其中串行化最容易理解,也最容易实现,即每一次只允许一个用户操作数据库即可;

而读未提交也容易实现,将数据库不设置任何访问和修改权限即可。这样的设置导致事务的原子性被打破了,一般很少使用该设置。

对于读已提交,意思是只要有用户提交了对数据库的修改(update、delete或者insert),都会对同一个session的查询结果产生影响,所以同一个session的多次访问,读取到的数据内容和数据条数都有可能是不同的。我们只需遵循事务的原子性对数据库更改就行了。

可重复读,意思是其它用户的update和delete对于同一个session的查询不产生影响,但是还是会被insert影响,所以同一个session的多次访问,读取到的数据内容是一样的,但是数据条数可能会因为insert而变多。

在每一条数据,都记录其创建时间和最后一次修改时间;而在建立session时,也记录session的创建时间,为了达到读已提交或者可重复读的要求,我们只需要在查询到的结果中再通过时间来筛选一次即可。

具体实现的思路如下:

读未提交:所有人都可以同时对数据库操作,其事务中每一个步骤对数据库都是立即生效的,而不是在提交时才有影响。

读已提交:所有人都可以同时对数据库操作,但是对于每一个用户来说,先将数据库中要操作的数据缓存到本机,事务中的每一步操作都是面向本机的缓存的,只有在最后提交的时候,才会同步到数据库中。

可重复读:每一条数据修改时都记录一个时间戳,而新建的数据时间戳为0,用户查询时,也记录建立session的时间戳。当查询时,如果查询到的某条记录的时间戳比session的时间戳晚,说明这条记录是在session建立后修改过的,那么此条记录就被舍弃。而新insert的数据,无论是再session建立前后,都不会被舍弃。这样就达到了可重复读的目的。

串行化:限定每次只有一个人访问数据库。只有这样才能完全服从事务的ACID(原子性、一致性、隔离性、持久性)隔离级别,但是这样做数据库的效率就很低了。

转载于:https://www.cnblogs.com/lixin4395/p/10241494.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值