spring设计思想事务篇之数据库隔离级别

0,前言:数据库的事务隔离级别是关系型数据库事务的理论基础,

  隔离,理想状态下,不同的客户之间的事务操作不会对彼此有影响。实现对数据库资源的互斥性访问

  TPS: 单位时间内的事务数(Transactions Per Second),TPS越高,表示数据库的性能越好。

1,不同级别的隔离

  序列化读:规定同一时间内只能有一个客户端连接数据库进行事务操作,在这个客户端完成事务之前,其他客户端不能对数据库进行事务操作。相当于是以数据库级别作为互斥资源,也可以以数据库表级别作为互斥资源。

  可重复读:采用的是行锁,会出现幻读的问题:返回的记录数不一致,好像多读了数据一样,这种情况,称为幻读(Phantom Read

 

   读已提交:

    客户端B客户端D直接使用读锁读取数据,读锁是共享锁,所以可以同时进行;而客户端A客户端C 事务操作上,会存在两个环节:Uncommited—> Commited,在真正 commit的时候,则使用写锁以互斥的方式完成事务,把互斥访问资源的时机压缩的更短。但是存在度的数据不一致的问题

 

 带给我们的启示:数据库事务操作中,尽可能少的用查询结果作为参数来执行后续的更新语句。

    读未提交,将资源互斥的访问粒度细化到未提交的行数据上,进一步的提高并发能力。但是出现了脏读现象。客户端reader在事务的过程中,读取到了其他客户端updater尚未提交的数据,之后客户端reader 可能将其当做已经持久化的数据进行业务操作,而实际上,客户端updater可能将其数据回退;在此过程中,客户端reader读取的数据就成了脏数据,客户端reader的读数据行为为:脏读(Dirty Read)

 

 

  • SERIALIZABLE 序列化读,隔离级别最高,客户端以互斥的方式访问数据库资源,统一时间内,同一个资源只能被一个客户端访问,好像客户端在排队请求访问,所以称为序列化读。
  • REPEATABLE_READ 可重复读,可重复读能够保证,一个客户端在一个事务内,多次访问同一个资源时,返回结果是一样的,顾名思义,称为可重复读,这种隔离级别可能会造成幻读现象。
  • READ_COMMITTED 读已提交,即客户端在一个事务内,每次查询读取的数据都是从数据库读取最新的已提交的数据;这种隔离界别可能会造成不可重复读幻读现象。
  • READ_UNCOMMITTED 读未提交,即客户端在一个事务内,可以读取到其他客户端事务的尚未提交的数据;这种隔离级别可能会造成脏读不可重复读幻读 现象。
posted @ 2020-10-19 12:13  笨笨走了  阅读(183)  评论(0编辑  收藏  举报