菜鸟笔记
提升您的技术认知

MySQL事务隔离级别与ACID

事务

事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是
一个整体
.MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。

事务基本操作

创建一个测试表

create table account(
	id int primary key,
	name varchar(50) not null default '',
	balance decimal(10,2) not null default ''
	); 

开始一个事务

start transaction;

创建一个保存点

savepoint 保存点名;

回到保存点(根据具体情况)

rollback to 保存点名; 

代码操作

mysql> start transaction; --开启事务
Query OK, 0 rows affected (0.00 sec)
mysql> savepoint aa; --设置保存点aa
Query OK, 0 rows affected (0.00 sec)
mysql> insert into account values(1, '张三', 10); --添加一条记录
Query OK, 1 row affected (0.00 sec)
mysql> savepoint bb; -- 设置保存点bb
Query OK, 0 rows affected (0.00 sec)
mysql> insert into account values(2, '李四', 10000); --再添加一条记录
Query OK, 1 row affected (0.00 sec)
mysql> select * from account; --两条记录都在了
+----+--------+----------+
| id | name   | balance  |
+----+--------+----------+ 
| 1  | 张三    | 10.00    |
| 2  | 李四    | 10000.00 |
+----+--------+----------+
2 rows in set (0.00 sec)
mysql> rollback to bb; -- 发现后来添加这一条记录是误操作。所以回滚到bb状态
Query OK, 0 rows affected (0.01 sec)
mysql> select * from account; -- 第二条记录没有了
+----+--------+---------+
| id | name   | balance |
+----+--------+---------+
| 1  |  张三   |  10.00  |
+----+--------+---------+
1 row in set (0.03 sec) 

事务的四大特征

  • 原子性

事务是应用中的最小执行单位,具有不可分割的特性一样,事物是应用中最小逻辑执行题

  • 一致性

事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而改未完成的事务对数据库所做的修改已被写入数据库,此时数据库就处于一种不正确(不一致)的状态。因此一致性是通过原子性来保证的。

  • 隔离性

各个事务的执行互不干扰,任意一个事务的内部操作对其他并发事务都是隔离的。也就是说,并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能互相影响。

  • 持久性

持久性是指一个事务一旦被提交,它对数据库所做的改变都要记录到永久存储其中(如:磁盘) .

隔离级别

  • 脏读 :

事务A读取了事务B还未提交的数据,并进行了操作

  • 不可重复读:

同一个事务中两次相同的查询得到的结果不一致。因为在两次查询中间可能有其他事务执行了影响该查询结果的更新操作。

  • 幻读:

幻读可以算是不可重复读的特例,这里主要是指结果集的总的行数不匹配。比如事务1的两次查询中间,事务2插入了可被事务1查询条件检索到的行,或者删除相应的某一行。那么事务1可能会出现,第二次查询出来的结果有第一次查询没有的或者丢失了一些第一次查询的结果。(这感觉就像幻觉一样,命名一样的查询,第一次没查出来的第二次咋就有了,真奇怪,所以叫幻读)

(例)可串行化


当客户端A在执行select过程中,DBMS会对库加锁,如果这时客户端B执行插入,只要还没释放锁,插入不进
去,会将B的update语句放入等待队列,直到释放了锁或超时。

mysql默认的隔离级别是可重复读,一般情况下不要修改