事务的介绍
事务是应用操作里面严密的操作,所有操作必须一致完成,否则就会一起撤回原操作,也就是事务acid中的a(原子性),一个事务要么全部执行成功,要么全部执行失败
事务结束:1.当事务步骤全部完成并且执行成功后,事务提交
2.在事务中一个步骤执行失败,就会rollback回滚到原状态
事务的四大特征
1.原子性(Atomicity)
事务包含的数据库操作要么全部执行成功,要么全部执行失败并回滚到原状态
2.一致性(Consistrncy)
当事务总体提交时,事务的数据保持一致性,例如事务A和事务B各有1000元,他们进行转账操作,当转账完成后,他们的余额必须也是2000元。
3.隔离性
事务与事务之间运行时互补打扰,即事务A和事务B操作各自的数据,并发状态下不能互相打扰。
4.持久性
事务一旦提交对数据的修改是永久性的,接下来的操作对数据不会有任何影响
MySQL的四种隔离级别
1.读已提交
2.读未提交
3.可重复读(MySQL默认隔离级别)
4.串行化
隔离级别 脏读 不可重复读 幻读 读已提交 √ √ √ 读未提交 × √ √ 可重复读 × × √ 串行化 × × ×
查看MySQL隔离级别
show global/seesion variables like 'trasaction_iso%' like和variables模糊查看
show @@global/seesion transaction_isolation 查看全局或此会话隔离级别
改变MySQL隔离级别
set global/seesion transaction isolation level [四个隔离级别]
测试MySQL事务隔离级别
创建test测试表 并插入数据
create table test(
id int,
num int
)engine=innodb;
INSERT INTO test (id, num) VALUES
(2, 200),
(3, 300),
(4, 400);
打开两个命令端来演示事务的隔离级别
事务A一直切换四个隔离级别 事务B修改数据 看看有什么变化来读懂MySQL的四个事务隔离级别
将A的事务隔离界别设读未提交(read-uncommitted)
set session transaction isolation level read uncommitted;
隔离级别已经设为了读未提交
开启数据A并且查询数据
开启事务B并改变数据并查询 发现查到了已经够更改的数据
查询事务A 发现也查看到事务B更改的数据 但是事务B还没有进行提交
事务B回滚
再次插叙事务A的数据,发现没有被改变 因此得出结论 这个是读到了脏的数据 成为脏读 可以设为 读已提交的隔离级别来避免
读已提交
查看事务A的隔离级别并开启事务A
开启事务B并查询
在事务B里面更改数据并查询
在事务A里再次查询发现数据没改变
事务B提交数据
事务A查询数据发现数据被改变
这就解决了脏读 不会再事务B还没有提交时,被事务A查到 但是 会出现不可重复读 两次读到的数据不一致
设置事务的隔离界别为可重复读(repeatable read)
开始事务A并查询
开启事务B并查询数据
在事务B里更改数据并查询
发现数据已经改变 回到事务A再次查询
发现事务A没有数据改变 解决了幻读 提交事务B
再次插叙事务A
发现数据还是没有改变 解决了不可重复读 提交事务A再次查询
发现事务A数据得到了变化 解决了幻读和不可重复读 但读到的数据不是最新版本 出现了幻读
事物的隔离级别 串行化
开始事务A并查询
开启事务B并修改数据
发现处于堵塞状态 然后结束事务A
查看事务B的状态并查询数据
发现当事务A提交时,事务B自动修改成功 这是最高的隔离界别 解决了幻读,可重复读,脏读