目录
事务的概述
- 事务:指的是一组逻辑操作,要么同时成功要么同时失败。
- 使用事务:
a、开启事务、提交事务:
b、开启事务,回滚事务:
3. 事务的四大特性:
原子性:组成事务的最小单元是不可分割的,要么同时成功要么同时失败。
一致性:执行事务前后,数据的完整性是一致的;(也就是案例中总钱数是一样的)
隔离性:在数据库中,各个事务之间是独立的额,不受其他事务的影响。
持久性:事务一旦结束,数据就会序列化到数据库中。
事务的隔离级别
脏读:一个事务读到了另一个事务未提交的数据。
不可重复读:一个事务读到了另一个事务已经提交的update数据
虚读/幻读:一个事务读到了另一个事务已经提交的insert数据
事务的隔离级别
read uncommitted :脏读,不可重复读,虚读都有可能发生
read committed :避免脏读。但是不可重复读和虚读是有可能发生
repeatable-read :避免脏读和不可重复读,但是虚读有可能发生。(mysql默认隔离级别)
serializable :避免脏读,不可重复读,虚读。
从上到下级别越来越高,但是效率越来越低。
事务的隔离级别的演示:演示脏读
设置事务隔离级别:SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;
查看事务的隔离级别:select @@tx_isolation;
演示思路:
- 开启两个窗口A和B;
- 设置A窗口的隔离:SET SESSION TRANSACTION ISOLATION LEVEL read committed;
- 在A和B两个窗口中开启事务
- 在B窗口完成转账操作,但不提交事务。
- 在A窗口查询数据,会发现发生了脏读
事务的隔离级别的演示:避免脏读和不可重复读的发生
演示思路:
1、 开启两个窗口A和B;
2、 设置A窗口的隔离:SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;
3、 在A和B两个窗口中开启事务
4、 在B窗口完成转账操作,但不提交事务。
5、 在A窗口查询表数据,会发现没有转账成功,也就是说没有查询到另一个事务未提交的数据,避免了“脏读”;
6、在B窗口提交事务,
7、在A窗口查询数据,会发现两次数据不一样,也就发生了“不可重复读”
事务的隔离级别的演示:避免不可重复读
演示思路:
1、 开启两个窗口A和B;
2、 设置A窗口的隔离:SET SESSION TRANSACTION ISOLATION LEVEL repeatable-read;
3、 在A和B两个窗口中开启事务
4、 在B窗口完成转账操作,但不提交事务。
5、 在A窗口查询表数据,会发现没有转账成功,也就是说没有查询到另一个事务未提交的数据,避免了“脏读”;
6、在B窗口提交事务,
7、在A窗口查询数据,会发现两次数据一致,也就说避免了“不可重复读”
事务的隔离级别的演示:演示串行化
演示思路:
1、 开启两个窗口A和B;
2、 设置A窗口的隔离:SET SESSION TRANSACTION ISOLATION LEVEL serializable;
3、 在A和B两个窗口中开启事务
4、 在B窗口中插入一条记录,但不提交事务。
5、 在A窗口查询表数据,发现A窗口已经卡住了(说明事务不允许出现并发,A窗口需要等待B窗口事务执行完成以后,才会执行A窗口的事务。)当B窗口的事务结束(提交或者回滚),那么A窗口马上就会出现结果。