MySQL数据库的隔离级别

问题:

innodb ,如果一个session A开启事务读一条数据,另一个session B开启事务更新这条数据,那么B能够顺序提交吗?A又读到的是什么值呢?

MySQL默认情况下,答案为:B可以立即更改这个记录,但是A始终都读的是B修改前的数据,即使B已经提交了。

A只有提交了之后,再select,就看到B更新之后的数据了



MySQL有四种隔离级别:

1、未提交读

就是可以读到别人未提交的数据,显然,这个隔离级别最低,而且完全没意义,没实现真正的任何隔离!

2、提交读

事务只能读取到别人提交过了的数据,这个是oracle的默认隔离级别,应用到上面的案例,那么当B提交后,A能够立即读取到B所提交的数据,不管A是否已经提交。

3、可重复读

可重复读的意思就是,即使别人提交了新的记录,当前连接依然读到的是当前事务开始时的记录,也就是和当前事务开始时重复的,一样的值。MySQL默认就是该级别,也就是上面这个案例所展示的样子

4、串行化

这个级别最严,所有的读和写都会相互互斥,等待对方完成。应用到上面的案例,B将没办法更新记录,除非A提交或者回滚。

MySQL 数据库隔离级别主要用于控制事务处理的并发度和一致性,主要分为四个级别: 1. **读未提交(READ UNCOMMITTED)**: 这是最宽松的隔离级别,允许读取到其他事务尚未提交的数据。这可能导致数据一致性问题,如脏读、不可重复读和幻读。 2. **读已提交(READ COMMITTED)**: 只能读取到其他事务已经提交了的数据。避免了脏读,但由于更新操作可能会导致不可重复读和幻读的情况。 3. **可重复读(REPEATABLE READ)**: 保证在同一事务内的查询结果始终一致,即查询结果不会受到其他事务的影响。可以防止脏读和不可重复读,但仍然可能出现幻读情况。 4. **序列化(SERIALIZABLE)**: 此级别提供最高程度的隔离性,所有的事务按照固定的顺序逐一执行,完全避免了脏读、不可重复读和幻读问题,但是它通常会影响性能并限制并发能力。 为了改变 MySQL 数据库的默认隔离级别,在 SQL 查询中使用 `SET` 命令即可: ```sql SET SESSION TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE]; ``` 例如,将当前会话的隔离级别设置为可重复读: ```sql SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` 更改隔离级别的影响因素包括但不限于数据库配置文件中的设置(例如通过 `my.cnf` 或者 `my.ini`),以及在需要时手动调整每个会话的隔离级别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值