少女祈祷中...

Mysql 事务

  1. 事务是数据库操作的最小单元,事务中的所有操作要么全部执行,要么全部不执行。
  2. 事务的ACID特性:
    1. 原子性:事务中的操作要么全部执行,要么全部不执行。
    2. 一致性:事务执行前和执行后,数据库的约束条件不变。
    3. 隔离性:事务的执行结果不受其他事务的影响。
    4. 持久性:事务执行后,结果会持久化到数据库中。

开启事务

1
2
3
4
start transaction; -- 开启事务
-- 执行事务操作
commit; -- 持久化到数据库中
rollback; -- 事务回滚

savepoint 保存点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> start transaction;

mysql> insert into test1 values (1);


mysql> savepoint part1;-- 设置一个保存点


mysql> insert into test1 values (2);


mysql> rollback to part1; -- 将savepint = part1的语句到当前语句之间所有的操作回滚


mysql> commit;-- 提交事务

只读事务

表示在事务中执行的是一些只读操作,如查询,但是不会做insert、update、delete操作,数据库内部对只读事务可能会有一些性能上的优化

1
2
start transaction read only; -- 开启只读事物
-- 其余和普通事务一样

事务的隔离级别

  1. 读未提交(Read Uncommitted)
  2. 读已提交(Read Committed)
  3. 可重复读(Repeatable Read)
  4. 串行化(Serializable)

查看隔离级别

1
show variables like 'transaction_isolation';

设置隔离级别

临时设置:

1
2
set session transaction isolation level read committed;
set global transaction isolation level read committed;

持久化设置:

找到mysql的配置文件my.cnf

1
2
3
# 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLE-READ可重复读,SERIALIZABLE串行

transaction-isolation=READ-UNCOMMITTED

重启数据库才能生效

每个级别的特点

  1. 读未提交( Read Uncommitted )

读未提交是隔离级别最低的一种事务级别。在这种隔离级别下,一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是脏数据,这就是脏读(Dirty Read)。

  1. 读已提交( Read Committed ):

在 Read Committed 隔离级别下,一个事务可能会遇到不可重复读(Non Repeatable Read)的问题。不可重复读是指,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。

  1. 可重复读( Repeatable Read ):

在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题。幻读是指,在一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录时,竟然能成功,并且,再次读取同一条记录,它就神奇地出现了。幻读就是没有读到的记录,以为不存在,但其实是可以更新成功的,并且,更新成功后,再次读取,就出现了。

  1. 可串行化( Serializable )

Serializable 是最严格的隔离级别。在Serializable隔离级别下,所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。
虽然 Serializable 隔离级别下的事务具有最高的安全性,但是,由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用Serializable隔离级别。
默认隔离级别:如果没有指定隔离级别,数据库就会使用默认的隔离级别。在MySQL中,如果使用 InnoDB,默认的隔离级别是Repeatable Read。

总结

理解事务的4个特性:原子性、一致性、隔离性、持久性
掌握事务操作常见命令的介绍
set autocommit可以设置是否开启自动提交事务
start transaction:开启事务
start transaction read only:开启只读事物
commit:提交事务
rollback:回滚事务
savepoint:设置保存点
rollback to 保存点:可以回滚到某个保存点
掌握4种隔离级别及了解其特点
脏读、不可重复读、幻读