MySql事务隔离级别

在你的并发事务下会产生问题,比较常见的有:脏读不可重复读幻读

脏读:举个栗子:事务A去读银行卡数据,然后切换到事务B,事务B取走了100元,未提交,然后回到事务A,此时事务A读数据的话,肯定是原始的余额,因为事务B取走的100元信息并未提交,这就是脏读

不可重复读指在一个事务里读了两次数据,单这两个数据读出的信息不一致。再举个栗子:仍以银行取钱为例,事务A读数据:1000元,此时换到事务B,事务B取走100元>提交,数据库的信息变为900元。返回事务A,事务A再次查询数据:900元。在同一个事务内两次读取的数据信息不一致,这就是 不可重复读

幻读:在一个事务中出现了未被发现的数据。还举个栗子:事务A执行查询,查到了3条数据(假设查到了'张三','李四','王五'三个用户信息) > 切换到事务B,事务B执行了insert操作(假设插入了一个用户'赵六'),向数据库添加了一条数据 > 返回事务A,事务A刷新的话就会发现多了个人'赵六',不知道从哪来的,这就是幻读。就好像出现了幻觉一样,这个问题出现的前提是并发事务中有事务发生了插入、删除操作

事务隔离级别

事务隔离级别,就是为了解决上面几种问题而诞生的。为什么要有事务隔离级别,因为事务隔离级别越高,在并发下会产生的问题就越少,但同时付出的性能消耗也将越大,因此很多时候必须在并发性和性能之间做一个权衡

事务隔离级别有4种(第五种为Spring提供的):

1、DEFAULT

默认隔离级别,基本无法解决什么问题

2、READ_UNCOMMITTED

读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用

3、READ_COMMITED

读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读

4、REPEATABLE_READ

重复读取,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决

5、SERLALIZABLE

串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了,但付出的却是性能

 表格信息:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值