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


    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(原子性、一致性、隔离性、持久性)隔离级别,但是这样做数据库的效率就很低了。

  • 相关阅读:
    HTML5印章绘制电子签章图片,中文英文椭圆章、中文英文椭圆印章
    送别2019,期待2020!
    [系列] Go
    当查询的数据来自多个数据源,有哪些好的分页策略?
    究竟什么样的开发流程是规范的?
    Git 分支设计规范
    API 接口设计规范
    一线技术管理者究竟在管什么事?
    一个人被提拔,不仅仅是能力,而是信任
    [系列] Go 如何解析 JSON 数据?
  • 原文地址:https://www.cnblogs.com/lixin4395/p/10241494.html
Copyright © 2020-2023  润新知