一.什么是事务?
事务(Transaction)是
将⼀组操作封装成⼀个执⾏单元(封装到⼀起),这⼀个执⾏单元要么⼀起执⾏成功,要么⼀起失败,不会出现执⾏“⼀半”的情况。
二.为什么⽤事务?
以银⾏转账为例,A 给B转账 ,如果执⾏了⼀半,断点了或者程序崩溃了,那么 A 账号的钱就永久消失了?那怎么办?⽤事务就可以解决,封装成⼀个执⾏单元,要么⼀起成功,要么⼀起失败。
三.事务怎么⽤?
事务的使⽤步骤有三个:
1.
开启事务(start transaction)。
2.
执⾏多条 SQL。
3.
提交/回滚事务(commit/rollback)。
四.事务的四⼤特性
1.原子性
⼀个事务中的所有操作,要么全部执⾏成功,要么全部执⾏失败。原⼦性是事务最重要的特性,全部执⾏失败并不是不执⾏,⽽是通过逆操作 rollback(回滚)数据。
2.持久性
事务执⾏完成之后,它所做的所有修改都是永久的(不会丢失)。
3.一致性
⼀个事务在执⾏前后数据必须保持⼀种合法的状态,事务总是从⼀个⼀致状态到另⼀个⼀致状态。例:⽐如转账操作,转账之前两个账号的总额是 100 元(各个 50 元),那么两个账户相互转账之后的钱总额也是 100 元,也就是事务总是从⼀个⼀致状态到另⼀个⼀致状态,不会说转账之前是100 元,相互转账之后变成 80 了,这就不符合⼀致性了。
4.隔离性
多个事务并发访问时,事务之间是相互隔离的,⼀个事务不应该被其他事务⼲扰,多个并发事务之间要相互隔离。
五.MySQL 事务隔离级别
1.
READ UNCOMMITTED:读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,⽽未提交的数据可能会发⽣回滚。因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。
2.
READ COMMITTED:读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执⾏中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读。
3.
REPEATABLE READ:可重复读,是 MySQL 的默认事务隔离级别,它能确保同⼀事务多次查询的结果⼀致。但也会有新的问题,⽐如此级别的事务正在执⾏时,另⼀个事务成功的插⼊了某条数据,但因为它每次查询的结果都是⼀样的,所以会导致查询不到这条数据,⾃⼰重复插⼊时⼜失败(因为唯⼀约束的原因)。明明在事务中查询不到这条信息,但⾃⼰就是插⼊不进去,这就叫幻读(Phantom Read)。
4.
SERIALIZABLE:序列化,事务最⾼隔离级别,它会强制事务排序,使之不会发⽣冲突,从⽽解决了脏读、不可重复读和幻读问题,但因为执⾏效率低,所以真正使⽤的场景并不多。
