1.什么是事务?
将一组操作封装成一个执行单元,要么一块执行成功,要么一块失败,不会出现执行一半的情况。
数据库引擎:InnoDB才支持事务,MyISAM不支持事务。
2.事务怎么用?
2.1开启事务 start transaction,mysql8之后使用begin
2.2提交事务 commit
2.3回滚事务 rollback
3.事务的四大特性(ACID)
(1)原子性(不可分割性 A):⼀个事务中的所有操作,要么全部执⾏成功,要么全部执⾏失败。
(2)一致性(C):⼀个事务在执⾏前后数据必须保持⼀种合法的状态,事务总是从⼀个⼀致状态到另⼀个⼀致状态。
(3)隔离性(独立性 I):多个事务并发访问时,事务之间是相互隔离的,⼀个事务不应该被其他事务⼲扰,多个并发事务之间要 相互隔离。
(4)持久性(D):事务执⾏完成之后,它所做的所有修改都是永久的(不会丢失)。
4.事务隔离级别:
(1)读未提交read uncommitted:可以读取到其他事务中未提交的数据。⽽未提交的数据如果发⽣回滚,那么读取到的数据就是幽灵数据,也称为脏数据,这个情况称为脏读。
(2)读已提交read committed:读取到已经提交事务的数据,解决了脏读问题。但不可重复读,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读。
(3)可重复读repeatable read:是 MySQL 的默认事务隔离级别,它能确保同⼀事务多次查询的结果⼀致。但也会有新的问题,⽐如此级别的事务正在执⾏时,另⼀个事务成功的插⼊了某条数据,但因为它每次查询的结果都是⼀样的,所以会导致查询不到这条数据,⾃⼰重复插⼊时⼜失败(因为唯⼀约束的原因)。明明在事务中查询不到这条信息,但⾃⼰就是插⼊不进去,这就叫幻读(Phantom Read)
(4)序列化SERIALIZABLE:事务最⾼隔离级别,它会强制事务排序,使之不会发⽣冲突,从⽽解决了脏读、不可重复读和幻读问题,但因为执⾏效率低,所以真正使⽤的场景并不多。
不可重复读与幻读区别:
不可重复读描述的侧重点不同,不可重复读描述的是修改操作,比如t1时间读取了一行数据,t2时间的时候读取到了这个数据,内容已经发生改变了,这个叫不可重复读;
而幻读描述的是幻象行的问题,它指在t1时间使用一个sql得到了n行数据,而t2时间使用相同的sql却得到了n+1条数据,那么多出来的一行就叫幻象行,这个操作就叫幻读。
不可重复读描述侧重点是修改操作,它指两次读取了同一行数据,得到了不同结果;
幻读描述侧重点是添加(或删除)操作,它指第一次读取到了N行数据,而第二次使用相同sql
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
可重复读(默认) | × | × | √ |
序列化 | × | × | × |
(1)查询事务的隔离级别
select @@global.tx_isolation,@@tx_isolation;
(2)设置当前客户端的事务隔离级别
set session transaction isolation level 事务隔离级别;