事务隔离

       什么是事务?

       在数据库中,事务主要用于处理操作量大,复杂度高的数据。事务是用来管理成批的 insert,update,delete 语句的。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
       在一个事务中,当事务开始时,可以处理多条SQL语句,但只有当事务提交时,这些SQL语句才会执行,但当事务处理过程中出错时,可以实现事务中所有SQL语句操作的回滚,即撤销所有SQL查询操作。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

       要了解事务隔离之前,先要对事务的基本要素有一定的认识。事务的基本要素可简单总结为(ACID):

       1. 原子性:事务是一个不可分割的整体,要不然成功,要不然失败回滚,不对数据库产生任何影响。

       2. 一致性:事务必须使数据库从一个正确性状态变换到另一个正确状态,也就是要遵守数据库表的既定规则

       3. 隔离性:当数据库开启一个事务时,不能被其他事务所干扰,事务与事务之间是相互隔离的。

       4. 持久性:指一个事务一旦被提交了,那该事务对数据库所造成的改变就是永久性的。

       数据库是被广大用户所共享访问的,当有多个用户在同一时刻对数据库进行访问和执行操作时,就可能会出现数据库的并发操作相关问题:

  1. 脏读:一个事务读取到了另一个事务未提交的数据操作结果。
  2. 虚读(不可重复读):事务1读取表中数据,然后事务2对表中数据进行了修改,当事务1再次读取表中数据时,读取的结果与事务1第一次读取的结果不同。
  3. 幻读:事务1读取表中数据,然后事务2往表中插入了数据或删除了数据,当事务1再次读取表中数据时,读取的结果与事务1第一次读取的结果不同。
  4. 更新丢失:事务1对数据的更新被事务2对数据的更新所覆盖

       总之,数据库高并发场景下可能会发生不同事务之间相互干扰,导致事务执行错误或执行回滚的情况。

       在对数据库执行事务操作时,为了保证事务的正常执行,保证并发读取数据的正确性,避免多个事务并发执行时的相互干扰,需要进行数据隔离。

       在标准的SQL规范中,定义了4个事务隔离级别,级别越高,对并发事务的处理限制越多,能解决的并发问题就越多,事务执行的正确性越高,同时数据库的性能会相应的降低。

第一级隔离(最低级别):Read uncommitted(读未提交)

       防止两个事务同时进行写操作,但仍然允许事务读取其他事务未提交的行数据。
       解决了更新丢失的问题,但仍可能出现脏读

第二级隔离:Read committed(读提交)

        当正在进行一个写事务时,禁止其他事务对该写事务所操作的行数据进行访问。但仍然可能出现虚读(不可重复读)即在事务A两次读取行数据之间事务B对行数据进行了修改,导致事务A两次读取行数据的结果不同。
       解决了更新丢失和脏读的问题,但仍可能出现虚读

第三级隔离:Repeatable read(可重复读取)

       可重复读取是指在一个事务内,如果多次读相同行数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的。但仍然可能出现幻读,因为其他事务对于该读事务行数据虽然不能进行修改,但仍可以进行增删操作。
       解决了更新丢失、脏读和虚读的问题,但仍可能出现幻读

第四级隔离(最高级别):Serializable(可序化)

       事务不能并发执行,只能一个一个顺序执行,这样就避免了任何的并发问题,但这样设置后的数据库性能会变得很低。
       解决了更新丢失、脏读、虚读和幻读的问题。


       MySQL设置事务隔离级别
#查看当前事务隔离级别
SELECT @@tx_isolation;
#设置事务隔离级别
set [global|session] transaction isolation level  + 隔离级别名称; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值