前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL数据库事务隔离级别--实例讲解

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

作者头像
JAVA葵花宝典
发布2019-05-29 16:11:52
1.7K0
发布2019-05-29 16:11:52
举报
文章被收录于专栏:JAVA葵花宝典

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

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

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

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

2. 开始事务

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

Step2:事务B

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

2. 开始事务

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

4. 事务还没有提交

Step3:事务A

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

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

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

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

Step1:事务A

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

2. 开始事务

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

Step2:事务B

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

2. 开始事务

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

4. 事务还没有提交

Step3:事务A

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

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

Step4:事务B

1. 提交事务

2. 确认余额为800

Step5:事务A

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

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

不可重复读的问题

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

Step1:事务A

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

2. 开始事务

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

Step2:事务B

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

2. 开始事务

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

Step3:事务A

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

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

Step4:事务A

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

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

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

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

Step1:事务A

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

2. 开始事务

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

Step2:事务B

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

2. 开始事务

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

4. 最后提示超时的错误

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

总结:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA葵花宝典 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档