Mysql学习日记:事务隔离级别和锁深度解析(二)

Mysql学习日记:事务隔离级别和锁深度解析(一)_长方体移动工程师的博客-CSDN博客

一.行锁与事务隔离级别案例分析

CREATE TABLE `account` (
    `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR ( 255 ) DEFAULT NULL,
    `balance` INT ( 11 ) DEFAULT NULL,
    PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8;
INSERT INTO `test`.`account` ( `name`, `balance` )
VALUES
    ( 'lilei', '450' );
INSERT INTO `test`.`account` ( `name`, `balance` )
VALUES
    ( 'hanmei', '16000' );
INSERT INTO `test`.`account` ( `name`, `balance` )
VALUES
    ( 'lucy', '2400' );

1.读未提交(能读取其他客户端未提交的数据)

1.1:打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值:set transaction_isolation='read-uncommitted'

1.2:在客户端A未提交前,开启客户端B,更新account

1.3:如上图,此时客户端B还没有提交事务,客户端A已经读取到了客户端B修改的数据了 

如果客户端B此时回滚,那么客户端A读取的数据就是脏数据了。

1.4:客户端A再次更新数据,发现数据还是400;

2.读已提交(只读取提交后的数据,但多次查询数据不一致)

2.1:打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值:set transaction_isolation='read-committed'

2.2:在客户端B中更新数据,未提交事务,此时客户端A读取不到客户端B更新的数据,解决了脏读的问题

2.3:提交客户端B中数据,此时客户端A再次查询,数据变更,结果与上一步不一致,产生了不可重复读问题

3.可重复读(同一个客户端中,对于多次相同查询,结果一致,有隔离性,是mysql默认模式

3.1:打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值:set transaction_isolation='repeatable-read'

3.2:客户端B对数据进行修改,但在客户端A中多次查询数据没有发生改变

 4.串行化(任何操作相关数据都会被枷锁,其他客户端只能等待,并发性极低,但解决了所有数据问题

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长方体移动工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值