事务是将一组操作封装成一个执行单元,这个执行单元要么一起成功要么一起失败,不会出现执行一半的情况。
1.开启事务start transaction:
2.执行多条SQL
3.提交或回滚事务commit/rollback:
1.读未提交:
该隔离级别的事务可以看到其他事务中未提交的数据,该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。
2.读已提交:
该隔离级别的事务能读取到已经提交事务的数据,
因此它不会有脏读问题。但由于在事务的执⾏中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读。
3.可重复读:
是 MySQL 的默认事务隔离级别,它能确保同⼀事务多次查询的结果⼀致。但也会有新的问题,比如此级别的事务正在执⾏时,另⼀个事务成功的插⼊了某条数据,但因为它每次查询的结果都是⼀样的,所以会导致查询不到这条数据,⾃⼰重复插⼊时⼜失败(因为唯⼀约束的原因)。明明在事务中查询不到这条信息,但⾃⼰就是插⼊不进去,这就叫幻读
(Phantom Read)。
4.序列化:
事务最高隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使⽤的场景并不多。
脏读:⼀个事务读取到了另⼀个事务修改的数据之后,后⼀个事务又进行了回滚操作,从而导致第⼀个事务读取的数据是错误的。
不可重复读:在⼀个事务中,两次查询同⼀条数据得到了不同的结果就是不可重复读。在⼀个事务两次查询中间,另⼀个事务把这条数据修改了。
幻读:当同⼀查询在不同时间产⽣不同的结果,就是事务中的幻读问题。