七天掌握SQL--->第四天:事务处理与并发控制

news/2024/11/25 9:04:41/

 

# 7天掌握SQL - 第四天:事务处理与并发控制

## 目标

- 学习事务处理的基本概念,如ACID特性。
- 掌握并发控制的方法,如锁机制、事务隔离级别等。
- 通过实际案例练习事务处理和并发控制。

 

## 1. 事务处理的基本概念

事务处理是数据库管理系统中的一个重要概念,它确保了数据的完整性和一致性。一个事务可以包含一个或多个数据库操作,这些操作要么全部成功,要么全部失败。

### 表格:事务的特点

| 特点   | 描述                                                         |
| ------ | ------------------------------------------------------------ |
| 原子性  | 事务中的所有操作要么全部完成,要么全部不完成。               |
| 一致性  | 事务必须使数据库从一个一致性状态转换到另一个一致性状态。   |
| 隔离性  | 事务的执行不会被其他事务干扰。                             |
| 持久性  | 一旦事务提交,其结果就是永久性的,即使系统故障也不会丢失。 |

### 例子代码:简单的事务操作

```sql
-- 开始事务
START TRANSACTION;

-- 执行一些数据库操作
INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com');
UPDATE users SET email = 'john.doe@example.com' WHERE name = 'John Doe';

-- 提交事务
COMMIT;
```

## 2. ACID特性

ACID是事务处理的四个关键特性,它们共同确保了事务的可靠性。

### 表格:ACID特性详解

| 特性   | 描述                                                         |
| ------ | ------------------------------------------------------------ |
| 原子性  | 事务中的所有操作要么全部成功,要么全部失败回滚。             |
| 一致性  | 事务必须保持数据的一致性,从一个一致性状态转换到另一个一致性状态。 |
| 隔离性  | 事务的执行不会被其他事务干扰,事务之间是隔离的。             |
| 持久性  | 一旦事务提交,其结果就是永久性的,即使系统故障也不会丢失。   |

### 例子代码:演示ACID特性

```sql
-- 原子性演示
START TRANSACTION;
INSERT INTO orders (product_id, quantity) VALUES (101, 2);
-- 假设这里发生错误
ROLLBACK;

-- 一致性演示
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;

-- 隔离性演示
START TRANSACTION;
SELECT * FROM accounts WHERE account_id = 1;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 另一个事务
START TRANSACTION;
SELECT * FROM accounts WHERE account_id = 1;
-- 这里看到的balance可能还没有更新
ROLLBACK;

-- 持久性演示
START TRANSACTION;
INSERT INTO logs (message) VALUES ('This is a log entry');
COMMIT;
-- 即使系统重启,这条日志也会被保留
```

## 3. MySQL中的事务处理命令

在MySQL中,事务处理可以通过以下命令来控制。

### 表格:MySQL事务处理命令

| 命令          | 描述                             |
| ------------- | -------------------------------- |
| START TRANSACTION | 开始一个新的事务。               |
| COMMIT        | 提交当前事务,使所有更改永久生效。   |
| ROLLBACK      | 回滚当前事务,撤销所有更改。       |
| SAVEPOINT     | 设置一个保存点,可以回滚到此点。   |

### 例子代码:使用事务处理命令

```sql
-- 开始事务
START TRANSACTION;

-- 执行一些操作
INSERT INTO products (name, price) VALUES ('Laptop', 1200);

-- 设置保存点
SAVEPOINT sp1;

-- 执行一些可能会失败的操作
UPDATE products SET price = 1100 WHERE name = 'Laptop';

-- 如果操作失败,回滚到保存点
ROLLBACK TO sp1;

-- 提交事务
COMMIT;
```

## 4. 并发控制的方法

并发控制是确保多个事务可以同时执行而不会导致数据不一致性的方法。

### 表格:并发控制方法

| 方法   | 描述                                                         |
| ------ | ------------------------------------------------------------ |
| 锁机制  | 通过锁定数据行或表来控制并发访问。                             |
| 事务隔离级别 | 定义事务可以看到其他事务的哪些更改。                             |

### 例子代码:并发控制

```sql
-- 锁机制演示
LOCK TABLES products WRITE;

-- 执行一些操作
UPDATE products SET price = 1100 WHERE name = 'Laptop';

-- 解锁
UNLOCK TABLES;

-- 事务隔离级别演示
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
SELECT * FROM products WHERE name = 'Laptop';
UPDATE products SET price = 1200 WHERE name = 'Laptop';
COMMIT;
```

## 5. 锁机制

锁机制是数据库并发控制的一种方式,它通过锁定数据行或表来防止数据不一致。

### 表格:锁的类型

| 锁类型   | 描述                                                         |
| -------- | ------------------------------------------------------------ |
| 共享锁   | 允许多个事务读取同一数据,但不允许修改。                       |
| 排他锁   | 允许事务修改数据,但不允许其他事务读取或修改。                 |

### 例子代码:使用锁

```sql
-- 共享锁
SELECT * FROM products WHERE name = 'Laptop' LOCK IN SHARE MODE;

-- 排他锁
SELECT * FROM products WHERE name = 'Laptop' FOR UPDATE;
```

## 6. 事务隔离级别

事务隔离级别定义了事务可以看到其他事务的哪些更改,以及何时可以看到这些更改。

### 表格:事务隔离级别

| 隔离级别   | 描述                                                         |
| ---------- | ------------------------------------------------------------ |
| READ UNCOMMITTED | 一个事务可以看到其他事务未提交的更改。                     |
| READ COMMITTED   | 一个事务只能看到其他事务已提交的更改。                     |
| REPEATABLE READ  | 一个事务可以看到它开始时已经存在的数据,并且在事务期间不会被其他事务修改。 |
| SERIALIZABLE    | 最高的隔离级别,事务完全隔离,一个事务执行时,其他事务不能并发执行。 |

### 例子代码:设置事务隔离级别

```sql
-- 设置事务隔离级别为可重复读
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 开始事务
START TRANSACTION;

-- 执行查询
SELECT * FROM products WHERE name = 'Laptop';

-- 执行更新
UPDATE products SET price = 1300 WHERE name = 'Laptop';

-- 提交事务
COMMIT;
```

## 7. 实际案例练习

让我们通过一个实际案例来练习事务处理和并发控制。

### 案例:库存管理系统

假设我们有一个库存管理系统,需要处理订单和库存。

### 例子代码:库存管理系统

```sql
-- 开始事务
START TRANSACTION;

-- 检查库存
SELECT stock FROM inventory WHERE product_id = 101;

-- 减少库存
UPDATE inventory SET stock = stock - 1 WHERE product_id = 101;

-- 添加订单
INSERT INTO orders (product_id, quantity) VALUES (101, 1);

-- 提交事务
COMMIT;
```

## 8. 总结

在今天的学习中,我们了解了事务处理的基本概念,包括ACID特性,以及MySQL中的事务处理命令。我们还学习了并发控制的方法,包括锁机制和事务隔离级别,并通过实际案例进行了练习。事务处理和并发控制是确保数据库数据一致性和完整性的关键技术,掌握它们对于数据库管理员和开发者来说至关重要。

通过今天的学习,你应该能够:

- 理解事务处理的基本概念和ACID特性。
- 掌握MySQL中的事务处理命令。
- 理解并发控制的方法,包括锁机制和事务隔离级别。
- 通过实际案例练习事务处理和并发控制。

希望这些内容能帮助你更好地理解和应用事务处理与并发控制。记得多加练习,以便在实际工作中能够熟练运用这些知识。
 


http://www.ppmy.cn/news/1549774.html

相关文章

鸿蒙主流路由详解

鸿蒙主流路由详解 Navigation Navigation更适合于一次开发,多端部署,也是官方主流推荐的一种路由控制方式,但是,使用起来入侵耦合度高,所以,一般会使用HMRouter,这也是官方主流推荐的路由 Navigation官网地址 个人源码地址 路由跳转 第一步-定义路由栈 Provide(PageInfo) pag…

idea添加版权信息

1、添加Copyright Profiles 打开Settings -> Editor -> Copyright -> Copyright Profiles -> 新增 Copyright (c) 【你的版权信息】 【开始年份】-${today.year}. All rights reserved.如: Copyright (c) by cwp 2024-${today.year}. All rights rese…

Zero-Shot Next-Item Recommendation using Large Pretrained Language Models-问题咨询

问题背景: 我正在尝试复现一篇名为 “Zero-Shot Next-Item Recommendation using Large Pretrained Language Models” 的论文中的实验结果。 遇到的问题: 缺少关键代码: 我发现论文代码库中没有提供计算 HR10 和 NDCG10 这两个关键指标的…

JavaWeb后端开发知识储备2

目录 1.HttpClient 2.微信小程序开发 3.Spring Cache 1.HttpClient 简单来说,HttpClient可以通过编码的方式在Java中发送Http请求 2.微信小程序开发 微信小程序的开发本质上是前端开发,对于后端程序员来说了解即可 3.Spring Cache Spring Cache 是…

Spring Boot 3.3高级日志配置详解:从 Logback 到 Log4j 2 的全面掌握

Spring Boot 3.3 对日志系统进行了一些更新和改进,特别是在对 Logback 和 Log4j 2 的支持上。以下是从 Logback 切换到 Log4j 2 的一些高级配置详解: 1. 依赖管理 首先,你需要在项目的 pom.xml 或 build.gradle 文件中包含正确的依赖。 对…

基于STM32的火灾报警装置的Proteus仿真

文章目录 一、火灾报警1.题目要求2.思路2.1 主控2.2 传感器2.3 设定阈值--按键2.4 报警和通风2.5 OLED显示2.6 电源部分2.7 远程终端 3.仿真3.1 未仿真时3.2 仿真开始,界面13.3 切换界面23.4 切换界面3 4.仿真程序4.1 程序说明4.2 主函数4.3 OLED显示函数 二、总结 …

什么是Axios,有什么特点

什么是 Axios? Axios 是一个基于 Promise 的 HTTP 客户端,可以用于浏览器和 Node.js 环境。它由 Matt Zabriskie 创建,旨在提供一个简单、灵活且功能强大的 HTTP 请求库。Axios 支持所有现代浏览器和 Node.js,可以用于发送 GET、…

第2.5节 AI文本——做课题

让AI文本工具kimi学习也很重要,例如我们要做一个课题,让它学习类似的内容,这些内容可能是docx文件、也可能是pdf文件、也可能是ppt文件,我们可以上传附件。 下图中的“曲别针”作用就是上传附件的。 Prompt 请认真学习附件中的三…