事务
概念
一系列操作的集合;
原子性:这个事务要么成功,要么不成功;不成功则回到执行事务的初始状态
隔离性:事务之间互不干扰,事务在提交之前相互是不可见的
一致性:数据库执行前后,数据都处于一致的状态
持久性:执行完成后,数据就会保存在数据库中
前置命令
事务被异常终止,数据会自动回滚
ctrl / 强制数据库发生异常退出
systemctl restart mysqld 重启mysql服务
使用select @@transaction_isolation; 进行查询隔离级别
set global transaction isolation level READ UNCOMMITTED; 设置隔离级别
show variables like 'autocommit'; 查看提交方式
set autocommit=0; 更改提交方式
ON——自动提交
OFF——手动提交
begin 开启事务
end 结束事务并持久化
接下来使用两个窗口演示,约定窗口:左a右b
读未提交——系统默认
两个事务同时启动,a事务读到b事务未提交的部分
设置事务隔离级别 set global transaction isolation level READ UNCOMMITTED;并重启
两个事务同时开始,插入数据之后,a可以读到未提交的内容
读提交
两个事务同时执行,a事务不能在b事务提交之前看到b事务对表的修改
设置事务隔离级别 set global transaction isolation level read committed;并重启
两边都开启事务,a端commit之前,b端无法看到更新的数据
a端commit之后,b端仍然处于事务中,但是可以看到a端提交的数据
可重复读
在一个事务中进行增删改时,另一个事务不会收到影响(在执行第一句命令的时候,就生成一张view视图,读取的一直是这个视图的内容)
设置事务隔离级别 set global transaction isolation level repeatable read;并重启
a,b开启事务,a插入数据,b查不到
a进行commit,b依旧查不到;b只有commit之后才能查到数据的变化
串行化
事务之间对表的修改有先后顺序
设置事务隔离级别 set global transaction isolation level serializable;并重启
哪个事务先开始第一句,这个事务就已经持有锁——谁先启动事务无所谓,关键在于谁先对表动手,谁先动手谁就有锁
等待队列的单位是事务,只有一个事务提交,才能执行下一个事务
b先动手;a需要等待b提交完毕才能执行update;当a执行完update之后,b不能立即看见变换,因为a的事务还没有结束,a提交完事务之后,b才能看到变化
脏读、幻读、不可重复读
脏读:在一个事务中看到另一个事务未提交的数据
幻读:在一个事务中看到另一个事务已经提交的数据(原本存在的数据现在不存在)——另一个事务的insert/update/delete对本事务产生的影响
不可重复读:在一个事务执行相同的查询语句,看到不同的内容——本事务的select查到不同的内容