目录

1、什么是事务?

2、为什么要使用事务?

3、事务的使用

4、事务的四大特性(ACID)

5、MySQL事务的四种隔离级别 ※


1、什么是事务?

        事务就是将一组操作封装成一个执行单元,要么一块执行成功,要么一块失败,不存在部分执行成功的情况。事务保证了执行的稳定性。

        数据库引擎:InnoDB才支持事务,MyISAM不支持事务。

2、为什么要使用事务?

        举一个简单的例子:转账

        张三有 1000余额,李四有0,李四生活拮据,张三出于同情要给李四转500,分为以下步骤实现操作:

        ①先扣除自己(张三)的500块。

update account set money = money - 500 where name = '张三';

        ②给李四的账户加500块。

        若在步骤①操作完成后,出现断电、关机等一系列突发状况,会导致步骤①完成了而步骤②没能执行,导致张三的500块凭空消失。因此用事务来规避这种意外状况。

3、事务的使用

        3.1 开启事务:mysql 8 之前使用的是 start transaction,mysql 8 之后使用的是 begin

        (转账业务,多条SQL)

        3.2 提交事务:commit

        3.3 回滚事务:rollback

c 操作mysql事务 mysql使用事务_sql

         因为开启了事务,所以在系统恢复后可以进行日志查询,找问题来进行回滚,把钱还给张三,rollback相当于一个逆操作,再把500块还给张三。

注意事项:事务在开启之后,必须以提交事务(commit)或者回滚事务(rollback)来结束。

4、事务的四大特性(ACID)※

①原子性(Atomicity):

        事务中的所有操作要么全部成功,要么全部失败,把这种特性叫做原子性。

②一致性(Consistency):

        事务执行前后数据必须保持一种合法的状态,也就是事务总是从一个一致状态转换到另一个一致状态。例如:转账前后张三和李四的钱总数是不变的。

③隔离性(Isolation):

        多个事务并发执行时,事务直接进行相互隔离。一个事务在执行过程中,不会受到另一个事务的影响。

④持久性(Durability):

        事务执行成功后,所有被修改的数据都会永久的保留下来。

5、MySQL事务的四种隔离级别 ※

①读未提交 read uncommitted:在此隔离级别的事务中,可以读取到其他事务未提交的数据,而未提交的数据如果发生了回滚操作,那么当前事务读到的数据就是幽灵数据,又名脏数据,这种情况就叫做脏读

MySQL支持给每个连接客户端单独设置事务的隔离级别

a)查询事务的隔离级别

select @@global.tx_isolation,@@tx_isolation;

c 操作mysql事务 mysql使用事务_c 操作mysql事务_02

 b) 设置当前客户端的事务隔离级别

set session transaction isolation level 事务隔离级别;

 

c 操作mysql事务 mysql使用事务_sql_03

 

c 操作mysql事务 mysql使用事务_c 操作mysql事务_04

 结论:事务的隔离级别:读未提交存在脏读问题。

②读已提交 read committed 可以解决脏读问题,但它存在不可重复读问题。

不可重复读:使用相同的SQL,执行两次,得到了不同的结果,叫做不可重复读。

c 操作mysql事务 mysql使用事务_不可重复读_05

 

c 操作mysql事务 mysql使用事务_mysql_06

读已提交的事务隔离级别可以解决脏读的问题,但是它存在不可重复读的问题。 

③可重复读 repeatable read (MySQL默认的事务隔离级别)

c 操作mysql事务 mysql使用事务_不可重复读_07

c 操作mysql事务 mysql使用事务_mysql_08

 可重复读的事务隔离级别可以解决不可重复读的问题,但存在幻读的问题

问题:不可重复读和幻读有何区别?

答:不可重复读和幻读的侧重点不同,不可重复读描述的是修改操作,比如t1时刻读取了一条数据,t2时刻执行相同的SQL又读取了此数据,但此刻内容已经发生了变化,这就叫不可重复读;而幻读描述的是幻象行的问题,它是指在t1时刻使用一个SQL得到了n条数据,而在t2时刻使用相同的SQL得到了n+1 条数据,那么多出来的这一行就叫做幻象行,这个操作叫做幻读。all in all:侧重点不同,不可重复读描述的是修改数据,幻读描述的是添加或者删除数据。

④序列化 serializable   事务最⾼隔离级别,它会强制事务排序,使之不会发⽣冲突,从⽽解决
了脏读、不可重复读和幻读问题,但因为执⾏效率低,所以真正使⽤的场景并不多。
 


c 操作mysql事务 mysql使用事务_mysql_09

 

※四大隔离级别对比:

c 操作mysql事务 mysql使用事务_mysql_10

 MySQL 隔离性问题严重程度:

 脏读<不可重复读<幻读