Mysql事务及隔离级别
- 1.事务是什么?
- 2.事务操作
- 演示
- 3.事务的特性
- 4.事务隔离级别及代码演示
- 0)查看和设置事务隔离级别
- 1)读未提交(read uncommitted)
- 2)读已提交(read committed)
- 3)可重复读(repeatable read)
- 4)序列化(serializable)
1.事务是什么?
事务是一系列sql操作的组合,这些操作作为一个整体来运行,要么全部成功,要么全部失败
mysql默认的InnoDB存储引擎支持事务操作,其它存储引擎都不支持事务操作
2.事务操作
# 开启事务
start transaction;
#提交事务
commit;
# 回退
rollback;
演示
建表:
create table if not exists Person(name varchar(20));
操作1:
操作2:
3.事务的特性
- 原子性
事务是一系列操作的整体,是最小的工作单元,不可再分 - 一致性
事务中的所有操作要么全部成功,要么全部失败 - 隔离性
并发执行的多个事务相互独立,并不干扰 - 永久性
事务提交之后,数据库就会保存没有提交的数据,提交之后对数据库的改变是不可回退的
4.事务隔离级别及代码演示
事务隔离级别有四种:
读未提交、读已提交、可重复读、序列化
0)查看和设置事务隔离级别
查看事务隔离级别:
select @@tx_isolation;
设置事务隔离级别:
# 设置数据库事务隔离级别为读未提交
set global transaction isolation level read uncommited;
# 设置数据库事务隔离级别为读已提交
set global transaction isolation level read commited;
# 设置数据库事务隔离级别为可重复读
set global transaction isolation level repeatable read;
# 设置数据库事务隔离级别为序列化
set global transaction isolation level serializable;
设置事务隔离级别后需要退出mysql客户端并重新打开,这时隔离级别才会修改过来
1)读未提交(read uncommitted)
两个并发的事务,一个事务可以读取到另外一个事务提交之前的数据(也就是没有提交的数据)
存在的问题是脏读,也就是读取到的数据并不一定是最后存储到数据库的数据,读取到的可能是临时数据
演示:
2)读已提交(read committed)
两个并发的事务,一个事务只能读取到另一个事务提交之后的数据
这种隔离级别存在不可重复读的问题,也就是一个事务中多次读取到的数据是不一致的,因为当事务1读取事务2提交之前和提交之后的数据可能是不同的
演示:
3)可重复读(repeatable read)
一个事务只能读取到本次事务开始之前的数据,即使在另一个事务中修改数据并提交了事务或者提交了多个事务,读取到的数据还是本次事务开始之前的数据,也就是说多次数据读取到的数据是重复的。但是这种隔离级别存在幻读问题,也就是说读取到的数据并不真实,数据库中的数据可能在此次事务运行期间发生了修改。
演示:
4)序列化(serializable)
一个事务开启后,其它事务就不能运行,直到先开启的事务运行结束;
演示: