mysql事务和锁的实践

简介: mysql事务和锁的实践

概念解释:


脏读 : 就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据


不可重复读 : 是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据,并且提交了修改。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。


幻读 :  是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。


mysql 的隔离级别

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

实验如下:


第一次采用RC隔离级别


A窗口开启事务不提交,更新数据会锁住数据。

mysql> select * from class_teacher;
id class_name teacher_id
1 aaaa 2
2 bbb 3

2 rows in set (0.00 sec)

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> update class_teacher set class_name = 'ccc' where id = 1;

Query OK, 1 row affected (0.01 sec)

Rows matched: 1 Changed: 1 Warnings: 0

B窗口更新数据会因为A窗口的锁提示失败。

mysql> update class_teacher set class_name = 'ddd' where id = 1;

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

B窗口插入数据则成功

mysql> insert into class_teacher values (3, 'eee', 4);

Query OK, 1 row affected (0.00 sec)

RC可以避免脏读,可以避免另一个事务对已有数据进行修改。

但无法避免


可重复读:如果A窗口查询了一次数据,B窗口对该数据进行修改并且提交,A窗口再次读取数据的时候,数据已经改变。

幻读:B窗口仍能插入新数据,B窗口插入新数据后,A窗口再次读取数据,数据就会改变


第二次采用RR隔离级别


A窗口开启事务,读取数据。

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from class_teacher;
id class_name teacher_id
1 ddd 2
2 bbb 3
3 eee 4
4 fff 5

4 rows in set (0.00 sec)

B窗口开启事务,修改和插入数据,提交。

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> update class_teacher set class_name = 'ggg' where id = 1;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> insert into class_teacher values(5, 'kkk', 6);

Query OK, 1 row affected (0.00 sec)

mysql> select * from class_teacher;
id class_name teacher_id
1 ggg 2
2 bbb 3
3 eee 4
4 fff 5
5 kkk 6

5 rows in set (0.00 sec)

mysql> commit;

A窗口再次读取数据,B窗口修改的数据不会影响到A,但新插入的数据影响到了A

mysql> select * from class_teacher;
id class_name teacher_id
1 ddd 2
2 bbb 3
3 eee 4
4 fff 5

4 rows in set (0.00 sec)

RR隔离级别可以避免脏读,可重复读和幻读(注:大部分资料都写着不能解决幻读,mysql内部其实已经解决了)

GAP锁

A窗口事务未提交

mysql> update class_teacher set class_name = 'ass' where teacher_id = 2;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

B窗口事务

mysql> insert into class_teacher values(9,'asd',2);

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

mysql> insert into class_teacher values(10, 'asd', 10000);

Query OK, 1 row affected (0.00 sec)

一条成功,一条失败,mysql内部会将teacher_id=2的数据锁住


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
10月前
|
SQL 关系型数据库 MySQL
MySQL锁机制:并发控制与事务隔离
本文深入解析了MySQL的锁机制与事务隔离级别,涵盖锁类型、兼容性、死锁处理及性能优化策略,助你掌握高并发场景下的数据库并发控制核心技巧。
|
11月前
|
存储 监控 Oracle
MySQL事务
MySQL事务具有ACID特性,包括原子性、一致性、隔离性和持久性。其默认隔离级别为可重复读,通过MVCC和间隙锁解决幻读问题,确保事务间数据的一致性和并发性。
MySQL事务
|
SQL AliSQL 关系型数据库
MYSQL的全局锁和表锁
本文介绍了MySQL中的锁机制,包括全局锁、表级锁及其应用场景。全局锁通过`Flush tables with read lock (FTWRL)`实现,主要用于全库逻辑备份,但会阻塞更新和结构变更操作。表级锁分为显式表锁(`lock tables`)和元数据锁(MDL),前者用于控制并发访问,后者自动加锁以确保读写正确性。文章还探讨了如何安全地为小表添加字段,建议通过设置DDL等待时间或使用MariaDB/AliSQL的NOWAIT/WAIT功能避免业务阻塞。这些方法有助于在高并发场景下优化数据库性能与安全性。
380 0
|
9月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的事务隔离级别
数据库并发访问时易引发数据不一致问题。如客户端读取到未提交的事务数据,可能导致“脏读”。MySQL通过四种事务隔离级别(读未提交、读已提交、可重复读、可序列化)控制并发行为,默认为“可重复读”,以平衡性能与数据一致性。
487 0
|
10月前
|
关系型数据库 MySQL 数据库
MySql事务以及事务的四大特性
事务是数据库操作的基本单元,具有ACID四大特性:原子性、一致性、隔离性、持久性。它确保数据的正确性与完整性。并发事务可能引发脏读、不可重复读、幻读等问题,数据库通过不同隔离级别(如读未提交、读已提交、可重复读、串行化)加以解决。MySQL默认使用可重复读级别。高隔离级别虽能更好处理并发问题,但会降低性能。
328 0
|
安全 关系型数据库 MySQL
mysql事务隔离级别
事务隔离级别用于解决脏读、不可重复读和幻读问题。不同级别在安全与性能间权衡,如SERIALIZABLE最安全但性能差,READ_UNCOMMITTED性能高但易导致数据不一致。了解各级别特性有助于合理选择以平衡并发性与数据一致性需求。
333 1
|
Ubuntu 关系型数据库 MySQL
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
575 16
|
10月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
598 158
|
10月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

推荐镜像

更多