1.事务的定义
事务其实就是一组sql语句。而执行这组sql语句时,要么都执行成功,要么都执行失败
2.事务的原则
- 原子性:事务时一个整体,其中的sql语句要么都执行成功,要么都执行失败
- 一致性:事务执行后应该保持最终数据的值是一致的
- 隔离性:多个用户同时操作互不受影响
- 持久性:事务执行成功后就持久化到数据库
3.事务的隔离级别
3.1.并发事务带来的问题
- 脏读(Dirty read):用户A使用事务操作数据库时,事务中的sql语句修改了数据库中的内容,但此时事务并没有执行完毕即事务还未提交。用户B在此刻使用该数据库时就能看到用户A还未提交的数据。
- 丢失修改(Lost to modify):事务A在读取一个数据时,事务B也在访问该数据,那么在事务A修改了该数据后,事务B也修改了该数据。这样事务A的数据结果就丢失了。
- 不可重复读(Unrepeatableread):事务A中需要多次读取某数据,而在事务A执行的过程中,事务B也在执行,并将该数据修改了。事务A第一次读取到的是没被修改的值,第二次读取到的是被事务B修改了的值,导致事务A两次读取同一数据的值不同。
- 幻读(Phantom read):幻读与不可重复读类似,在事务A在第一次查询数据后,并发事务B又插入了几条数据,事务A后续的查询中,发现查询处的数据与前面查询出的数据不一致
3.2.不可重复读和幻读的区别
不可重复读重点是修改(数据内如的变化),幻读的重点是插入或删除(数据量的变化)。
3.3.事务的隔离级别
- 读取未提交(read-uncommited):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
- 读取已提交(read-commited):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
- 可重复读(repeatable-read):对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- 串行化(serializable):最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过
SELECT@@tx_isolation;
命令来查看
4.事务的使用
mysql是默认开启事务自动提交的
//关闭自动提交
set autocommit = 0;
//开启自动提交
set autocommit = 1;--默认
--手动提交事务
--1、关闭自动提交
set autocommit = 0;
--2、开启事务
start transaction;
--3、事务中的sql
sql语句
--如果成功,则全部提交
commit;
--如果失败,则全部回滚
rollback;
--事务结束
--4、sql语句结束后,直接开启自动提交即可
set autocommit = 0;