目录
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
因为开启了事务,所以在系统恢复后可以进行日志查询,找问题来进行回滚,把钱还给张三,rollback相当于一个逆操作,再把500块还给张三。
注意事项:事务在开启之后,必须以提交事务(commit)或者回滚事务(rollback)来结束。
4、事务的四大特性(ACID)※
①原子性(Atomicity):
事务中的所有操作要么全部成功,要么全部失败,把这种特性叫做原子性。
②一致性(Consistency):
事务执行前后数据必须保持一种合法的状态,也就是事务总是从一个一致状态转换到另一个一致状态。例如:转账前后张三和李四的钱总数是不变的。
③隔离性(Isolation):
多个事务并发执行时,事务直接进行相互隔离。一个事务在执行过程中,不会受到另一个事务的影响。
④持久性(Durability):
事务执行成功后,所有被修改的数据都会永久的保留下来。
5、MySQL事务的四种隔离级别 ※
①读未提交 read uncommitted:在此隔离级别的事务中,可以读取到其他事务未提交的数据,而未提交的数据如果发生了回滚操作,那么当前事务读到的数据就是幽灵数据,又名脏数据,这种情况就叫做脏读。
MySQL支持给每个连接客户端单独设置事务的隔离级别
a)查询事务的隔离级别
select @@global.tx_isolation,@@tx_isolation;
b) 设置当前客户端的事务隔离级别
set session transaction isolation level 事务隔离级别;
结论:事务的隔离级别:读未提交存在脏读问题。
②读已提交 read committed 可以解决脏读问题,但它存在不可重复读问题。
不可重复读:使用相同的SQL,执行两次,得到了不同的结果,叫做不可重复读。
读已提交的事务隔离级别可以解决脏读的问题,但是它存在不可重复读的问题。
③可重复读 repeatable read (MySQL默认的事务隔离级别)
可重复读的事务隔离级别可以解决不可重复读的问题,但存在幻读的问题
问题:不可重复读和幻读有何区别?
答:不可重复读和幻读的侧重点不同,不可重复读描述的是修改操作,比如t1时刻读取了一条数据,t2时刻执行相同的SQL又读取了此数据,但此刻内容已经发生了变化,这就叫不可重复读;而幻读描述的是幻象行的问题,它是指在t1时刻使用一个SQL得到了n条数据,而在t2时刻使用相同的SQL得到了n+1 条数据,那么多出来的这一行就叫做幻象行,这个操作叫做幻读。all in all:侧重点不同,不可重复读描述的是修改数据,幻读描述的是添加或者删除数据。
④序列化 serializable 事务最⾼隔离级别,它会强制事务排序,使之不会发⽣冲突,从⽽解决
了脏读、不可重复读和幻读问题,但因为执⾏效率低,所以真正使⽤的场景并不多。
※四大隔离级别对比:
MySQL 隔离性问题严重程度:
脏读<不可重复读<幻读