MySQL数据库事务隔离级别--实例讲解

事务隔离级别是指多个事务同时操作数据库时,事务之间相互隔离的程度,SQL 92规范有四种隔离级别,MySQL InnoDB存储引擎也支持这四种级别:

640?wx_fmt=png

下面我们通过实例来讲解这四种隔离级别,首先创建一个表并插入一条记录:

CREATE TABLE `checking` (

  `customer_id` int(11) NOT NULL,

  `customer_name` varchar(255) DEFAULT NULL,

  `balance` decimal(16,4) DEFAULT NULL,

  `create_date` datetime DEFAULT NULL,

  `update_date` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,

  PRIMARY KEY (`customer_id`),

  KEY `idx_customer_id` (`customer_id`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


-- ----------------------------

-- Records of checking

-- ----------------------------

INSERT INTO `checking` VALUES ('1002', 'Jane', '500.0000', '2018-11-01 09:57:08', '2018-11-08 16:34:09');

INSERT INTO `checking` VALUES ('1003', 'Tom', '300.0000', '2018-11-01 09:57:08', '2018-11-08 16:34:09');

INSERT INTO `checking` VALUES ('1004', 'John', '600.0000', '2018-11-01 09:57:08', '2018-11-08 16:34:09');


  一、事务的四种隔离级别--读未提交

Step1:事务A

640?wx_fmt=png

1. 设置当前session的事务隔离级别为读未提交

2. 开始事务

3. 查询客户1002的余额为500


Step2:事务B

640?wx_fmt=png

1. 设置当前session的事务隔离级别为读未提交

2. 开始事务

3. 更新客户1002的余额为800

4. 事务还没有提交


Step3:事务A

640?wx_fmt=png

1. 再次查询客户1002的余额为,值800

2. 尽管事务B还没有提交

3. 如果事务B回滚了,那么事务A查询到的信息就脏数据


二、事务的四种隔离级别--读已提交

Step1:事务A

640?wx_fmt=png

1. 设置当前session的事务隔离级别为读已提交

2. 开始事务

3. 查询客户1002的余额为500


Step2:事务B

640?wx_fmt=png

1. 设置当前session的事务隔离级别为读已提交

2. 开始事务

3. 更新客户1002的余额为800

4. 事务还没有提交


Step3:事务A

640?wx_fmt=png

1. 再次查询客户1002的余额,值仍然为500

2. 事务B还没有提交,所以解决了脏读的问题


Step4:事务B

640?wx_fmt=png

1. 提交事务

2. 确认余额为800


Step5:事务A

640?wx_fmt=png

1. 再次查询客户1002的余额,值变成了800

1. 事务A并还没有提交,但这次读到的数据不一样了,产生

       不可重复读的问题


三、事务的四种隔离级别--可重复读

Step1:事务A

640?wx_fmt=png

1. 设置当前session的事务隔离级别为可重复读

2. 开始事务

3. 查询表中的所有记录,一共三条


Step2:事务B

640?wx_fmt=png

1. 设置当前session的事务隔离级别为可重复读

2. 开始事务

3. 向表中插入一条记录,customer_id=1100


Step3:事务A

640?wx_fmt=png

1. 不管事务B有没有提交,都查不到事务B插入的数据

2. 避免了不可重复读的问题,通过MVCC机制实现


Step4:事务A

640?wx_fmt=png

1. 把customer_id为1100的余额更新为460

2. 再次查询,发现表中有了四条记录,产生了幻读

3. 可以通过加锁读取最新的数据


四、事务的四种隔离级别--串行化

Step1:事务A

640?wx_fmt=png

1. 设置当前session的事务隔离级别为串行化

2. 开始事务

3. 查询表中的所有记录,一共三条


Step2:事务B

640?wx_fmt=png

1. 设置当前session的事务隔离级别为串行化

2. 开始事务

3. 向表中插入一条新的记录

4. 最后提示超时的错误

5. 串行化会强制把事务按照串行的方式执行,效率很低


总结:

640?wx_fmt=png

推荐阅读

基于win10+Docker+idea的SpringBoot项目容器化部署

惊了!7 行代码优雅地实现 Excel 文件导出功能?

技术经理:求求你,别再乱改数据库连接池的大小了!

19条效率至少提高3倍的MySQL技巧

一个历时五天的 Bug

JAVA葵花宝典的正确打开方式

640?wx_fmt=jpeg

关注一下,尽知JAVA事!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值