Skip to content

Commit

Permalink
update sql docs
Browse files Browse the repository at this point in the history
  • Loading branch information
fengzhao committed Oct 30, 2024
1 parent 704bc10 commit ecfe490
Showing 1 changed file with 57 additions and 6 deletions.
63 changes: 57 additions & 6 deletions docs/basic/10.sql-Transaction.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,23 +113,29 @@ alter table test1 add COLUMN test4 VARCHAR(20) ;
select * from INFORMATION_SCHEMA.INNODB_TRX;


-- 开始一个新的读写事务
BEGIN ;
-- 开始一个新的读写事务:四种写法

-- BEGIN 语句。这个语句本质上应该是辞旧迎新(提交老事务,准备新事务)。在一个会话中,如果前面的一个事务还没提交就遇到BEGIN语句时,这个BEGIN就会提交老事务,准备新事务。原因是MySQL不支持嵌套事务。前面的事务没有提交的情况下,又要BEGIN开始一个新事务,前面的事务无处安放,只能被动提交了。
BEGIN ;
BEGIN WORK ;
START TRANSACTION ;
START TRANSACTION READ WRITE ;

-- 开始一个新的只读事务,
-- 开始一个新的只读事务
START TRANSACTION READ ONLY

-- 这两类语句都不需立即创建一致性读视图,事务的启动将延迟至实际需要时。



-- 开启一个新的读写事务:两种写法
START TRANSACTION WITH CONSISTENT SNAPSHOT
START TRANSACTION WITH CONSISTENT SNAPSHOT, READ WRITE
START TRANSACTION WITH CONSISTENT SNAPSHOT, READ ONLY

-- 开启一个新的只读事务
START TRANSACTION WITH CONSISTENT SNAPSHOT, READ ONLY

-- BEGIN 语句 , 这个语句本质上提交老事务,准备新事务。
-- 在一个会话中,如果前面的一个事务还没提交就遇到BEGIN语句时,这个BEGIN就会提交老事务,准备新事务
-- 这两类语句都会先启动事务,随后立即创建一致性读视图。



Expand Down Expand Up @@ -213,6 +219,51 @@ mysql> select * from classes; --最后输出,确实只有存盘点之前的
7 rows in set
```

### MySQL中的事务

前面铺垫了很多数据基础知识,作为 MySQL 中支持事务的默认存储引擎,InnoDB 对表中数据的读写操作都在事务中执行。

`MySQL` 被设计为支持高并发,支持很多客户端同时连接到数据库,这些连接可以同时执行 `SQL`。如果这些 `SQL` 都要读写 InnoDB 表,`InnoDB` 会为每个连接启动一个事务,这意味着需要同时启动很多事务。

对于 `OLTP` 场景,通常情况下,事务都会很快执行完成。启动事务、执行 SQL、提交事务的整个流程只会持续很短的时间。

以这样一个场景为例:

- 客户端连接到 MySQL;
- 客户端执行 begin 语句;
- 客户端执行一条 update 语句,按主键 ID 更新一条记录;
- 这个步骤中,InnoDB 会在执行 update 语句之前,真正启动一个事务;
- 客户端执行 commit 语句;
- 客户端关闭数据库连接。InnoDB 会在这一步释放事务。

在这个场景下,InnoDB 事务从启动到释放的整个生命周期,有可能只持续 1 ~ 2 毫秒(甚至更短)。


#### 事务对象和事务池

由于要存放**事务 ID****事务状态****Undo 日志编号****事务所属的用户线程**等信息,每个事务都有一个与之对应的对象,我们称之为**事务对象**

每个事务对象都要占用内存,如果每启动一个事务都要为事务对象分配内存,释放事务时又要释放内存,会降低数据库性能。为了避免频繁分配、释放内存对数据库性能产生影响,InnoDB 引入了事务池(Pool),用于管理事务。

顾名思义,事务池中放的是事务对象。事务池也一样有大小限制,不能无限制的存放事务对象。数据库繁忙的时候,有很多很多事务对象,需要多个事务池来管理。事务池多了之后就有如下问题:

- 事务池的管理分配:怎么创建新的事务池?
- 客户端创建了一个新的数据库连接,要获取一个新的事务对象,从哪个事务池获取?
- 多个

为了解决这些问题,InnoDB 又引入了**事务池管理器(PoolManager)**,用于管理事务池。












## 并发控制

> 在计算机科学,特别是程序设计、操作系统、多处理机和数据库等领域,并发控制(Concurrency control)是确保及时纠正由并发操作导致的错误的一种机制。
Expand Down

0 comments on commit ecfe490

Please sign in to comment.