MySQL事务,事务的隔离级别


YL     2022-03-03     316

MySQL事务,事务的隔离级别

目录

MySQL事务

事务的四个特性

  • 原子性 事务包含的所有操作要么全部成功 ,要么全部失败

  • 一致性

  • 隔离性 多个并发事务之间是相互隔离的,互不影响

  • 持久性 事务一旦提交,对数据库中的数据改变就是永久性的,要保持持久性很简单,事务提交之后,把数据持久化到磁盘上.

开启事务, 创建保存点 p1 dml语句1

创建保存点p2 dml语句2

rollback回滚

如果不开启事务,dml操作是默认提交的 rollback回滚不起作用

如果开启事务时,没有创建保存点, 那么rollback 默认就是回退事务开始时的状态

如果不考虑隔离性,会发生什么事呢?

脏读 一个事务读取到了另外一个事务未提交的数据

不可重复读 当A事务进行中,B事务提交的修改在A事务中能查询到B事务修改的数据,多次读取同一个数据,读到的数据不一样,

在一个事务中多次读取同一个数据,在这个事务还没结束时,另外一个事务也读取同一数据并修改,那么在第一个事务多次读取时,读到的数据不一致,这样就发生了不可重复读

不可重复读和脏读的区别是 脏读 是读到了别的事务未提交的数据
不可重复读是读到了别的事务提交的数据,多次读取的数据不一致.

幻读 一个事务读取了N条数据后,另外一个事务增添了符合条件的M条数据 第一个事务再次读取,得到了N+M条数据,就产生了幻读 也就是说第一个事务第一次读取的数据比后来读取到的数据数目少了

不可重复读和幻读的区别 不可重复读主要针对update 和delete操作,幻读针对的是insert操作

四种隔离级别解决了上述问题

  1. 读未提交(Read uncommitted)
select 语句不加锁,
会发生脏读的可能, 实际应用中很少使用.

  2. 读提交(Read commited)

可避免脏读发生的可能,大多数数据库的默认隔离级别就是读提交.(MySQL不是)

  3. 可重复读(Repeatable read)

MySQL的默认隔离级别,

  4. 串行化(Serializable)
最高的隔离级别,通过强制事务串行执行,避免了幻读的问题,串行化会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁征用的问题, 实际应用很少用到这个隔离级别,除非是非常需要数据一致性而且可以接受没有并发的情况下,可以考虑使用该级别


以上隔离级别最高的就是串行化Serializable,级别最低的就是读未提交,当然级别越高,执行效率就越低,因为串行化这样的级别,就是以 锁表 的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待

MySQL支持上面四种隔离级别. 默认隔离级别是可重复读

Oracle支持读已提交 和串行化两种隔离级别, 默认的隔离级别是读已提交