MySQL事务的隔离级别事务的隔离级别
MySQL事务的隔离级别事务的隔离级别
数据库事务简单介绍数据库事务简单介绍
MySQL在执行sql语句的时候,会遇到一些场景,一系列操作必须全部执行,而不能仅执行一部分。例如,一个转账操作:
-- 从id=1的账户给id=2的账户转账100元
-- 第一步:将id=1的A账户余额减去100
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- 第二步:将id=2的B账户余额加上100
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
这两条SQL语句必须全部执行,或者,由于某些原因,如果第一条语句成功,第二条语句失败,就必须全部撤销。这种把多条
语句作为一个整体进行操作的功能,被称为数据库事务数据库事务。
数据库事务可以确保该事务范围内的所有操作都可以全部成功或者全部失败。如果事务失败,那么效果就和没有执行这些SQL
一样,不会对数据库数据有任何改动。
所以,数据库事务具有ACID这4个特性:
Atomic,原子性原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;
Consistent,一致性一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;
Isolation,隔离性隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;
Duration,持久性持久性,即事务完成后,对数据库数据的修改被持久化存储。
事务并发事务并发
多个事务,同时提交的话,如果串行执行,则会造成事务的响应时间过长,用户体验极差,所以
同时提交的事务,是并发执行的。
对多个并发事务如果不加以控制,则可能会造成一下四种问题
脏读脏读
事务读取了另一个事务未提交的修改事务读取了另一个事务未提交的修改,如下图,事务T2读取了事务T1未提交的修改Write(x),
之后事务T1进行了回滚操作,导致事务T2读取了一个不存在的数据,所以称为脏读