当前位置: 首页 > 工具软件 > Rancho > 使用案例 >

rancho log MySQL相关知识梳理一

司空元凯
2023-12-01

面向秋招-MySQL相关知识梳理

第一节:MySQL事务
第二节:MySQL锁+MVCC
第三节:MySQL日志
第四节:MySQL优化



MySQL-事务


一、事务概念

一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中的所有操作都正常执行完了,整个事务才会被提交(commit)给数据库;如果有部分事务处理失败,那么事务就要回退(roll back)到最初的状态,因此,事务要么全部执行成功,要么全部失败。

二、ACID特性

1.事务的原子性(Atomic):

事务是一个不可分割的整体,事务必须具有原子特性,及当数据修改时,要么全执行,要么全不执行,即不允许事务部分的完成。

2.事务的一致性(Consistency):

一个事务执行之前和执行之后,数据库数据必须保持一致性状态。数据库的一致性状态必须由用户来负责,由并发控制机制实现。就拿网上购物来说,你只有让商品出库,又让商品进入顾客的购物车才能构成一个完整的事务。

3.事务的隔离性(Isolation):

当两个或者多个事务并发执行时,为了保证数据的安全性,将一个事物内部的操作与其它事务的操作隔离起来,不被其它正在执行的事务所看到,使得并发执行的各个事务之间不能互相影响。

4.事务的持久性(Durability):

事务完成(commit)以后,DBMS保证它对数据库中的数据的修改是永久性的,即使数据库因为故障出错,也应该能够恢复数据!机器停电或者宕机种种情况,事务完成后,尚且保留在cache缓存中的数据也会被保存并存入IO磁盘中。依靠redo log:重做日志。

5.维持事务特性的机制:

ACD:是由MySQL的redo log和undo log机制来保证的。
I:是由MySQL事务的锁机制来实现保证。

三、事务并发存在的问题

事务处理不经隔离,并发执行事务时通常会发生以下的问题:

1.脏读(Dirty Read):

一个事务读取了另一个事务未提交的数据
例如当事务A和事务B并发执行时,当事务A更新后,事务B查询读取到A尚未提交的数据,此时事务A回滚,则事务B读到的数据就是无效的脏数据。
(事务B读取了事务A尚未提交的数据)

2.不可重复读(NonRepeatable Read):

一个事务的操作导致另一个事务前后两次读取到不同的数据
例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再次去读该数据,发现前后两次读的数据不一样。
(事务B读取了事务A已提交的数据)

3.虚读(Phantom Read)幻读:

一个事务的操作导致另一个事务前后两次查询的结果数据量不同。一个事务内的读取操作的结论,不能支撑之后的业务的执行
例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A新增或者删除了一条满足事务B查询条件的记录,此时事务B再去查询,发现查询到前一次不存在的记录,或者前一次查询的一些记录不见了。
(事务B读取了事务A新增加的数据或者读不到事务A删除的数据)

四、★事务的隔离级别★

为更好地处理并发事务,事务建立了隔离级别,不同数据库管理系统有不同的隔离方式处理并发问题

“脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。

数据库实现事务隔离的方式:

数据库实现事务隔离的方式,基本上可分为以下两种
1、一种是在读取数据前,对其加锁,阻止其他事务对数据进行修改
2、另一种是不用加任何锁,通过一定机制生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一 致 性读取。从用户的角度来看,好像是数据库可以提供同一数据的多个版本,因此,这种技术叫做数据多版本并发控制(MultiVersion Concurrency Control,简称MVCC或MCC),也经常称为多版本数据库。

MySQL隔离级别实现原理:锁+MVCC

隔离级别脏读不可重复读幻读
未提交读可以可以可以
已提交读RC不可以可以可以
可重复读RR不可以不可以可以
串行化不可以不可以不可以

MySQL支持的四种隔离级别是:

1.TRANSACTION_READ_UNCOMMITTED 未提交读:

说明在提交前一个事务可以看到另一个事务的变化。这样读脏数据,不可重复读和虚读都是被允许的。

2.TRANSACTION_READ_COMMITTED 已提交读:

说明读取未提交的数据是不允许的。这个级别仍然允许不可重复读和虚读产生。

3.TRANSACTION_REPEATABLE_READ 可重复读:

说明事务保证能够再次读取相同的数据而不会失败但虚读仍然会出现(例如事务A select条件搜索age== 20,事务B update其他数据的age=20,事务A再进行select条件搜索age== 20时会读到B更改后的新的数据)。

4.TRANSACTION_SERIALIZABLE 串行化:

是最高的事务级别,它防止读脏数据,不可重复读和虚读。

五、其他

MySQL事务相关命令:

1、SELECT @@AUTOCOMMIT; 查看MySQL是否自动提交事务

mysql> select @@autocommit; 
+--------------+ 
| @@autocommit | 
+--------------+ 
| 1 | 
+--------------+ 
1 row in set (0.00 sec)

0表示手动提交事务,1表示自动提交事务,设置事务提交方式为手动提交方式:

mysql> set autocommit=0; 
Query OK, 0 rows affected (0.00 sec)

2、BEGIN; 开启一个事务
3、COMMIT; 提交一个事务
4、ROLLBACK; 回滚一个事务到初始的位置
5、SAVEPOINT point1; 设置一个名字为point1的保存点
6、ROLLBACK TO point1; 事务回滚到保存点point1,而不是回滚到初始状态
7、SET TX_ISOLATION=‘REPEATABLE-READ’; 设置事务的隔离级别
8、SELECT @@ TX_ISOLATION; 查询事务的隔离级别

mysql> select @@tx_isolation; 
+-----------------+ 
| @@tx_isolation | 
+-----------------+ 
| REPEATABLE-READ | 可以看到MySQL默认工作在可重复读级别 
+-----------------+ 
1 row in set, 1 warning (0.00 sec)

总结

未完待续,隔离级别及其原理还需深入了解。。。

 类似资料: