mysql序列化_mysql-serializable-序列化隔离级别-串行化实例场景

MySQL事务隔离级别

-- SERIALIZABLE serializable 序列化 ;一个个事务排成序列的形式。事务一个挨一个执行,等待前一个事务执行完,后面的事务才可以顺序执行

-- REPEATEABLE READ repeatable read 可重复读 ;

-- READ COMMITED read committed 提交的可读;(oracle默认)

-- READ UNCOMMITED read uncommitted 未提交的可读;(mysql 默认)别的事务可以查看的到使用 当前事务还没提交的 数据;会 脏读,幻读,不可重复读。

mysql 的serializable序列化隔离级别所导致问题的模拟

首先,创建一张表来通过对该表的操作来实现

CREATE TABLE `software` (

`sid` int(11) DEFAULT NULL,

`version` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

写入一条记录 insert into (sid,version) values (1,1);

同事开启两个事务  事务A 事务B;

1,创建第一个mysql连接,设置当前会话的隔离级别为 serializable;开启一个事务A,查看software表中有一条记录;

05f084109a6f060597d9b45631299b8e.png

2.再创建一个新mysql连接,设置当前会话的隔离级别为 serializable;开启一个事务B,查看software表中有一条记录;

2a99f3111861920491904dea27fcca0f.png

3.回到事务A的mysql会话中执行 向software表插入一条数据;

5116eeb2c8129c7e24d3f3c4b9530e33.png

此时,事务A会执行失败,提示超时了。失败原因是,因为事务B也是serializable隔离级别的,并且还没被提交。serializable隔离级别的多个事务不可以同事对同一张表修改!

4.事务B执行commit;

253e3e0f6221f11a4ed0a23927e0ca9e.png

5.事务A重新执行插入一条记录:insert into software (sid,version) values (2,1);

1dd18ddd64d9ba1a6bd38d8e4e25f8fe.png

9ea9a7c43a131004cdd3680880e80298.png

事务A此时执行成功了!

结论:serializable隔离级别的多个事务不可以同事对同一张表修改!

另外:当事务A执行的过程中如果对software表有update操作,事务B也不可以对事务A用到的表software表进行查询操作!

1.事务A与事务B同时都只对software表做查询 select 操作,不会导致死锁,可以查询出结果!

同时开启事务A,事务B,然后执行查询操作

1)事务A,

d5018df502d8509f5c7baaab713b8c47.png

2)事务B,

6579a0595fa93c2bb0eb84350e388290.png

3)事务A,

16aafb2ed368bddb04e7ff0622e2abcc.png

4)事务B,

6dfd3e2836029d8e8b842bfbf8cb613e.png

2.事务A与事务B,都对software表做了查询操作,则事务A或者事务B不可以对software做修改,插入的操作了,因为会出现死锁的问题!

同时开启事务A ,事务B ;然后执行查询操作!

1)事务A

6579a0595fa93c2bb0eb84350e388290.png

2)事务B

6579a0595fa93c2bb0eb84350e388290.png

3)事务A

ac7a153038d28525fdb1ce144fc5e186.png

4)事务B

5426fefa3b72062ccf22eb5cb796a52e.png

5)事务A

df1eed55065eb23367c63d240cde89bc.png

此时事务A对software执行update 或者 insert 操作 都会失败, serializable 序列化 隔离级别,会造成表级锁,对所有的记录都不可以修改!

总结:在SERIALIZABLE级别下,不会使用mysql的mvcc机制,而是在每一个select请求下获得读锁,在每一个update操作下尝试获得写锁。

只有当事务A将对表software的update操作,insert操作 commit之后, 事务B才能看到 事务A对表作出的修改!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值