MySQL事务相关概念详解

一、事务的四大特性

1.原子性

一个事务要么全部执行,要么全部不执行。称为事务的原子性。

2.一致性

如果事务执行之前数据库是一个完整的状态,那么事务结束后,无论事务是否执行成功,数据库仍然是一个完整的状态。
数据库的完整状态:当一个数据库中的所有的数据都符合数据库中所定义的所有约束,此时可以称数据库是一个完整的状态。

有人说一致性是指AB之间转账,A减少了500块则B一定会增加500块。我认为这是片面的。这样的举例并没有抓住重点,但这样的举例太常见了,大家应该好好琢磨这个一致性。

3.持久性

事务一旦提交,数据将在数据库中永久的保存下来。被称为事务的持久性。

4.隔离性

当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰。

二、事务中会出现的问题

1.脏读

脏读:某一事务读取了另一个事务未提交的脏数据,我们不知道该数据是否会被提交,该数据可能出现撤销和提交两种状态。该数据是不可靠的。
例:A事务查看一条记录的a字段值为1,B事务修改该记录a字段为2,尚未提交。A再查看时发现该字段值变成了2。

2.不可重复读

不可重复读:指某一事务中两次读取数据的结果不同,即,在第二次读取和第一次读取之间提交了一次事务,该事务进行了UPDATE或DELETE操作。
例:A事务查看一条记录的a字段值为1,B事务修改该记录a字段为2,并提交。A再查看时发现该字段值变成了2。

3.幻读

幻读:指某一事务中两次读取数据得到的行数不同,即,在第二次读取和第一次读取之间提交了一次事务,该事务进行的了INSERT操作。
例:A事务对全表a字段值从1修改为2,B事务插入一条记录,a字段值为1,并提交。A再查看时发现有一条记录未被修改。

注意

不可重复读和幻读的区别在于,幻读主要指INSERT操作。

二、事务的四种隔离级别

1.读未提交(Read uncommitted)

隔离级别最低,该事务执行写操作时,其他事务中的写操作会被阻塞。执行读操作时,可以读取到其他事务修改后未提交的数据,所以会出现脏读,不可重复读和幻读。

2. 读已提交(Read committed)

隔离级别倒数第二,该事务执行写操作时,其他事务中的写操作会被阻塞。执行读操作时,不会读取到其他事务未提交的数据,读取到的是修改前的数据。所以不会出现脏读,会出现不可重复读和幻读。

3.可重复读(Repeatable read)

隔离级别倒数第三,该事务执行写操作时,其他事务中的写操作会被阻塞。执行读操作时,其他事务提交或未提交的数据都不会读取,读取到的是修改前的数据。因此不会出现不可重复读,但会出现幻读。
(可重复读只能防止UPDATE和DELETE,对于INSERT操作有可能读取到,这是出现幻读的原因。)

4.顺序读(Serializable)

该隔离等级最高,避免了所有情况,但效率最低。该事务开启后,其他事务均不能进行写操作,但可以进行读操作。因此避免了所有问题。

三、事务的具体操作

以mysql为例。

1.开启事务和关闭事务

//开启事务
begin;
//提交事务
commit;

2.设置和查看隔离级别

//查看隔离级别
select @@tx_isolation;
//设置隔离级别(隔离名称中空格都要变成‘-’,忽略大小写。)
set tx_isolation= '隔离级别名称';
//设置隔离级别为 可重复读。
set tx_isolation= 'repeatable-read';

注意

设置隔离级别一定要在开启事务之前。
对于使用MySQL命令窗口而言,当前窗口设置的隔离级别只对当前窗口中的事务有效。

猜你喜欢

转载自blog.csdn.net/qq_42068856/article/details/87096278
今日推荐