0
点赞
收藏
分享

微信扫一扫

MySQL的并发文件及事务隔离级别

上一篇 <<<MySql的表锁行锁及间隙锁
下一篇 >>>MySQL的MVCC多版本控制原理


事务传输属性是代码层面的,非数据库层面。

1.事务基本特性

2.事务的并发问题

2.1 脏读(一个事务读取另外一个未提交又回滚事务的数据)

2.2不可重复读(两次读取相同的数据不一致,中间被修改或删除了)

2.3幻读(两次读取相同的数据不一致,中间新增了)

3.事务隔离级别

隔离级别 脏读 不可重复读 幻读
未提交读(Read uncommitted) 可能 可能 可能
已提交读(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(Serializable) 不可能 不可能 不可能

3.隔离级别验证

3.1读未提交 可能会产生脏读

## 设置级别
set tx_isolation='read-uncommitted';
##sessionA 执行
set tx_isolation='read-uncommitted';
select @@tx_isolation;
begin ;
select * from jarye_account;
update jarye_account  set balance=balance-50 where id=1;
commit;
##如果我们的sessionA执行rollback;的情况下,sessionB使用脏读数据操作。
##sessionB执行
set tx_isolation='read-uncommitted';
select @@tx_isolation;
use jaryedb;
begin ;
select * from jarye_account;
commit;

3.2读已提交 避免脏读的问题

set tx_isolation='read-committed';

##sessionA
set tx_isolation='read-committed';
select @@tx_isolation;
begin ;
select * from jarye_account;
update jarye_account  set balance=balance-50 where id=1;
commit;

##sessionB
set tx_isolation='read-committed';
select @@tx_isolation;
begin ;
select * from jarye_account;
update jarye_account  set balance=balance-50 where id=1;
commit;

3.3 可重复读

set tx_isolation='repeatable-read';
##sessionA
set tx_isolation='repeatable-read';
select @@tx_isolation;
begin ;
select * from jarye_account;
update jarye_account  set balance=balance-50 where id=1;
commit;

##sessionB
set tx_isolation='repeatable-read';
select @@tx_isolation;
begin ;
select * from jarye_account;
commit;

3.4 验证幻读

sessionA 
begin;-- 获取全局事务id  1
-- select * from jarye_account where DB_TRX_ID=1
select * from jarye_account
commit;

sessionB
INSERT INTO `jarye_account` VALUES (14, 'jarye66', '500');

 在sessionA 执行
 update jarye_account set balance=300 where id = 14;
 出现幻读

3.5 串行化

sessionA
set tx_isolation='serializable';
begin ;
update jarye_account  set balance=balance-50 where id=1;
commit;


sessionB
begin ;
select * from jarye_account where balance='500';
INSERT INTO `jarye_account` VALUES (null, 'raby888', '500');

推荐阅读:
<<<MySQL发展历程与整体架构
<<<MySql连接空闲8小时自动断开的原因及连接池配置方法
<<<查询和更新sql语句执行原理
<<<MySQL存储引擎汇总
<<<InnoDB存储引擎的Buffer Pool 缓冲池底层结构
<<<Too many connections分析与processlist解读
<<<MySQL索引底层结构与实现原理
<<<MySql的表锁行锁及间隙锁
<<<MySQL的MVCC多版本控制原理
<<<MySQL常用命令汇总

举报

相关推荐

0 条评论