首页 > 其他分享 >事务隔离级别

事务隔离级别

时间:2023-03-09 20:22:33浏览次数:32  
标签:事务 隔离 money 提交 级别 id

为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有以下几种:

 

 读未提交、读已提交、可重复读、序列化

1). 查看事务隔离级别

SELECT @@TRANSACTION_ISOLATION;
2). 设置事务隔离级别

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
注意:事务隔离级别越高,数据越安全,但是性能越低。

串行化是指:我在执行并发事务操作的时候,我只允许一次一个事物来操作,a事务操作b事务时,只有当a事务操作完成提交之后,b事务才能够操作。这种隔离级别可以规避任何并发问题,但是性能最低。

一般采用数据库的默认级别。

举例:假如有两个事物,a事务和b事务,都对某张表账户表ac表主键为id进行操作。

设置隔离级别 read uncommited 这种隔离级别为读已提交,会出现“脏读”的情况。开启a事务,然后开启b事务,

a事务里面查询账户表id为1的money值,发现为2000,b事务对这个id的money进行加1000,此时,a,b事务都未提交,在a事务里再次查询账户表id为1的money值,发现变为3000,出现“脏堵”,也就是读了b事务未提交的数据,提交ab事务。

所以设置隔离级别为read uncommited会出现“脏读”。

为了解决这个问题,可以将隔离级别设置为read commited,但这种隔离级别会出现“不可重复读”。恢复账户表,同样开启a事务,然后再开启b事务。

a事务里面查询账户表表id为1的money值,发现为2000,b事务对这个id的money进行修改为3000,此时,a,b事务都未提交,在a事务里面继续查询账户表id为1的money值,发现即使b事务未提交,a事务查到的还是2000,避免了“脏堵”。但是提交b事务后,

在a事务里面查询账户表id为1的money值发现变为了3000,刚开始查是2000,而现在查又是3000,一个事物里面读到了两个不同的值,也就是出现了“不可重复读”,记得提交a事务。

为了解决这个问题,可以将隔离级别设置为repeatable read,但这种隔离级别会出现“幻读”。恢复账户表,同样开启a事务,然后再开启b事务。

a事务里面查询账户表id为2的记录,发现返回记录为空,接着b事务增加一条id为2,money为3000的账户信息并提交,此时a事务以为没有2这条记录执行插入操作,发现报错:主键冲突,又查一下账户表id为2的记录,发现还是为空,虽然两次查询都是空,也就是说避免了“不可重复读”,但是。插入这条不存在的数据时又提示存在,也就是出现了“幻读”。记得提交a事务。

为了解决这个问题,可以将隔离级别设置为serializable,这种隔离级别是最安全的,但是性能最低。恢复账户表,同样开启a事务,然后再开启b事务。

a事务里面查询账户表id为2的记录,发现返回记录为空,接着b事务增加一条id为2,money为3000的账户信息,发现b事务一直无响应,接着在a事务里面执行b事务执行的增加记录,执行成功,并提交,同时发现b事务立即响应并返回主键冲突的错误,这就相当于解决了“幻读”的问题,但是,b事务执行操作时需要等到a事务执行完才能响应并执行下面的操作。所以这样在高并发的情况下,性能是极低的。

因此虽然设置高的隔离级别可以解决数据的安全性问题,但是数据库的访问性能又降低了。为了平衡数据的安全性和数据库的性能开销,我们按照数据库的默认隔离级别REPEATABLE READ即“可重复读”来操作事务即可。

标签:事务,隔离,money,提交,级别,id
From: https://www.cnblogs.com/wekenyblog/p/17201259.html

相关文章

  • 并发事务问题
    赃读:一个事务读到另外一个事务还没有提交的数据。  比如B读取到了A未提交的数据。2).不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读......
  • 高德地图放大到一定级别空白问题
    项目中使用的高德地图,在放大到一定级别的时候,地图变成空白。我们可以采用当监听缩放到一定级别,则切换为标准地图来解决这一问题。代码如下:constinit=()=>{......
  • 随堂笔记14-spring之事务
    @EnableTransactionManagement工作原理:开启事务本质就是增加一个advisor,而使用@EnableTranscationManagement是向spring容器内添加俩个beanautoproxyRegisterproxyT......
  • 分布式事务-最大努力通知2 20230308
          ......
  • linux基础(1)--运行级别及root命令找回
    1系统运行级别0:关机1:单用户【找回丢失密码】2:多用户状态没有网络服务3:多用户状态有网络服务4:系统未使用保留给用户5:图形界面6:系统重启其中,最常用的为3和5。 有关......
  • 长事务
    缺点长事务会导致系统存在古老视图,提交前其undolog都必须保留,会占用大量存储空间。事务启动方式显式启动事务语句需要手动提交。begin或starttransaction。回滚......
  • 事务隔离
    隔离性与隔离级别事务特点:ACID(Atomicity、Consistency、Isolation、Durability)原子性/一致性/隔离性/持久性隔离级别读未提交一个事务还没提交时,其变更就能被其他......
  • 云图说丨云数据库GaussDB(for MySQL)事务拆分大揭秘
    摘要:数据库代理提供事务拆分的功能,能够将事务内写操作之前的读请求转发到只读节点,降低主节点负载。本文分享自华为云社区《【云图说】第270期云数据库GaussDB(forMySQL)......
  • 事务的传播行为
    事务的传播行为如果当前存在一个事务事务的传播行为(PropagationBehavior)表示整个业务处理过程所跨越的业务对象,将以什么样的行为参与事务。即在一个service中调用其他......
  • 分布式事务-最大努力通知 20230307
              ......