Mysql 事务
- 事务是数据库操作的最小单元,事务中的所有操作要么全部执行,要么全部不执行。
- 事务的ACID特性:
- 原子性:事务中的操作要么全部执行,要么全部不执行。
- 一致性:事务执行前和执行后,数据库的约束条件不变。
- 隔离性:事务的执行结果不受其他事务的影响。
- 持久性:事务执行后,结果会持久化到数据库中。
开启事务
1 | start transaction; -- 开启事务 |
savepoint 保存点
1 | mysql> start transaction; |
只读事务
表示在事务中执行的是一些只读操作,如查询,但是不会做insert、update、delete操作,数据库内部对只读事务可能会有一些性能上的优化
1 | start transaction read only; -- 开启只读事物 |
事务的隔离级别
- 读未提交(Read Uncommitted)
- 读已提交(Read Committed)
- 可重复读(Repeatable Read)
- 串行化(Serializable)
查看隔离级别
1 | show variables like 'transaction_isolation'; |
设置隔离级别
临时设置:
1 | set session transaction isolation level read committed; |
持久化设置:
找到mysql的配置文件my.cnf
1 | # 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLE-READ可重复读,SERIALIZABLE串行 |
重启数据库才能生效
每个级别的特点
- 读未提交( Read Uncommitted )
读未提交是隔离级别最低的一种事务级别。在这种隔离级别下,一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是脏数据,这就是脏读(Dirty Read)。
- 读已提交( Read Committed ):
在 Read Committed 隔离级别下,一个事务可能会遇到不可重复读(Non Repeatable Read)的问题。不可重复读是指,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。
- 可重复读( Repeatable Read ):
在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题。幻读是指,在一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录时,竟然能成功,并且,再次读取同一条记录,它就神奇地出现了。幻读就是没有读到的记录,以为不存在,但其实是可以更新成功的,并且,更新成功后,再次读取,就出现了。
- 可串行化( Serializable )
Serializable 是最严格的隔离级别。在Serializable隔离级别下,所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。
虽然 Serializable 隔离级别下的事务具有最高的安全性,但是,由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用Serializable隔离级别。
默认隔离级别:如果没有指定隔离级别,数据库就会使用默认的隔离级别。在MySQL中,如果使用 InnoDB,默认的隔离级别是Repeatable Read。
总结
理解事务的4个特性:原子性、一致性、隔离性、持久性
掌握事务操作常见命令的介绍
set autocommit可以设置是否开启自动提交事务
start transaction:开启事务
start transaction read only:开启只读事物
commit:提交事务
rollback:回滚事务
savepoint:设置保存点
rollback to 保存点:可以回滚到某个保存点
掌握4种隔离级别及了解其特点
脏读、不可重复读、幻读