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