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
读未提交,即客户端在一个事务内,可以读取到其他客户端事务的尚未提交的数据;这种隔离级别可能会造成脏读
、不可重复读
、幻读
现象。