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

 

# 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中的事务处理命令。
- 理解并发控制的方法,包括锁机制和事务隔离级别。
- 通过实际案例练习事务处理和并发控制。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922566.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高新技术行业中的知识管理:关键性、挑战、策略及工具应用

知识管理的关键性 在瞬息万变的信息时代,知识已成为高新技术行业的核心竞争要素。知识管理,这一旨在高效组织、整合并应用企业内外部知识资源的管理策略,对于推动高新技术企业的持续创新与发展至关重要。它不仅能够激发研发团队的创造力&…

IDEA 2024安装指南(含安装包以及使用说明 cannot collect jvm options 问题 四)

汉化 setting 中选择插件 完成 安装出现问题 1.可能是因为之前下载过的idea,找到连接中 文件,卸载即可。

【MyBatis】全局配置文件—mybatis.xml 创建xml模板

文章目录 模板文件配置元素typeAliasessettings 模板文件 创建模板 按照顺序打开【File】–>【settings】–>【Editor】–>【File and Code Templates】&#xff08;或直接搜索&#xff09; <?xml version"1.0" encoding"UTF-8" ?> <…

uni-app 发布媒介功能(自由选择媒介类型的内容) 设计

1.首先明确需求 我想做一个可以选择媒介的内容&#xff0c;来进行发布媒介的功能 &#xff08;媒介包含&#xff1a;图片、文本、视频&#xff09; 2.原型设计 发布-编辑界面 通过点击下方的加号&#xff0c;可以自由选择添加的媒介类型 但是因为预览中无法看到视频的效果&…

【Go】-go中的锁机制

目录 一、锁的基础知识 1. 互斥量/互斥锁 2. CAS&#xff08;compare and swap&#xff09; 3. 自旋锁 4. 读写锁 5. 乐观锁 & 悲观锁 6. 死锁 二、go中锁机制 1. Mutex-互斥锁 2. RWMutex-读写锁 2.1 RWMutex流程概览 2.2 写锁饥饿问题 2.3. golang的读写锁源…

Python 使用 Selenuim进行自动化点击入门,谷歌驱动,以百度为例

一、首先要下载谷歌驱动 1.&#xff08;打开谷歌浏览器 - 设置 - 关于谷歌&#xff0c;查看谷歌浏览器版本&#xff0c;否则不对应无法调用&#xff0c;会提示&#xff1a;selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This versio…

RCVS:A Unifed Registration and FusionFramework for Video Streams 译文

摘要:红外与可见光的跨模态配准与融合可以生成更全面的目标和场景信息表示。以前的框架主要关注于解决模态差异以及保留不同模态信息对不同静态图像对之间配准和融合任务性能的影响。然而&#xff0c;这些框架忽略了在现实世界设备上的实际部署&#xff0c;特别是在视频流的背景…

JDBC编程---Java

目录 一、数据库编程的前置 二、Java的数据库编程----JDBC 1.概念 2.JDBC编程的优点 三.导入MySQL驱动包 四、JDBC编程的实战 1.创造数据源&#xff0c;并设置数据库所在的位置&#xff0c;三条固定写法 2.建立和数据库服务器之间的连接&#xff0c;连接好了后&#xff…

Python 抓取笑话内容并存入 CSV

在互联网上&#xff0c;有许多有趣的内容等待我们去挖掘和收集。今天&#xff0c;我们就来深入了解一段 Python 代码&#xff0c;它能够帮助我们从指定网站抓取笑话内容&#xff0c;并将其整理保存为 CSV 文件&#xff0c;方便后续查看和分析。 结果展示&#xff08;文末附完整…

Redis-09 SpringBoot集成Redis

Jedis 和 lettuce 基本已经过时 集成RedisTemplate 单机 1.建 Modul 2.改pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

Linux:自定义Shell

本文旨在通过自己完成一个简单的Shell来帮助理解命令行Shell这个程序。 目录 一、输出“提示” 二、获取输入 三、切割字符串 四、执行指令 1.子进程替换 2.内建指令 一、输出“提示” 这个项目基于虚拟机Ubuntu22.04.5实现。 打开终端界面如图所示。 其中。 之前&#x…

夜天之书 #104 开源软件有断供的风险吗?

近期&#xff0c;Linux 上游因为受美国出口管制条例的影响&#xff0c;将移除部分开发者的 MAINTAINER 权限&#xff0c;引起了新一轮对开源依赖的重新评估。 关于其中开源精神和社群治理的讨论&#xff0c;卫 Sir 的两篇文章已经讨论得比较清楚&#xff08;见尾注&#xff09;…

tensorforce(dqn框架)安装

win7 64位操作系统 python版本&#xff1a;3.8.10 pip install tensorflow 默认的tensorflow的版本是2.31.0&#xff0c;安装tensorforce后自动升级到3.6.0 tensorflow:升级到3.6.0 keras&#xff1a;升级到3.6.0 tensorforce安装 pip3 install tensorforce protobuf 需要降到…

STM32抢占优先级不生效

板类型&#xff1a;STM32F103精英开发板代码背景&#xff1a; 设置了USART1中断和KEY_UP中断(使用EXTI0外部中断)两个中断的优先级分组都设为2&#xff08;2bit抢占优先级&#xff0c;2bit响应优先级)EXTI0中断抢占优先级设为3&#xff0c; 响应优先级设为3USART1抢占优先级设…

4.1_未授权漏洞

未授权漏洞 成因&#xff1a;配置错误&#xff0c;默认口令&#xff08;弱口令&#xff09;&#xff0c;接口配置不当&#xff1b;未授权漏洞 漏洞利用方式 Redis 未授权访问漏洞 Getshell方式 写入webshell&#xff1b; 连接目标redis&#xff1a;redis-cli -h 192.168.7…

快速识别模型:simple_ocr,部署教程

快速识别图片中的英文、标点符号、数学符号、Emoji, 模型会输出图片中文字行的坐标位置、最低得分、识别结果。当前服务用到的模型&#xff1a;检测模型、数字识别、英文符号识别。 一、部署流程 1.更新基础环境 apt update2.安装miniconda wget https://repo.anaconda.com/…

衡山派D133EBS 开发环境安装及SDK编译烧写镜像烧录

1.创建新文件夹&#xff0c;用来存放SDK包&#xff08;其实本质就是路径要对就ok了&#xff09;&#xff0c;右键鼠标通过Open Git Bash here来打开git 输入命令 git clone --depth1 https://gitee.com/lcsc/luban-lite.git 来拉取&#xff0c;如下所示&#xff1a;&#xff0…

蓝桥杯不知道叫什么题目

小蓝有一个整数&#xff0c;初始值为1&#xff0c;他可以花费一些代价对这个整数进行变换。 小蓝可以花贵1的代价将教数增加1。 小蓝可以花费3的代价将整数增加一个值,这个值是整数的数位中最大的那个(1到9) .小蓝可以花费10的代价将整数变为原来的2倍, 例如&#xff0c;如果整…

读取mysql、kafka数据筛选后放入mysql

要求&#xff1a; 从kafka的topic-car中读取卡口数据&#xff0c;将超速车辆写入mysql的t_monitor_info表 当通过卡口的车速超过该卡口限速的1.2倍 就认定为超速。 G107 1&#xff09;卡口数据格式如下&#xff1a; action_time long --摄像头拍摄时间戳&#xff0c;精确到秒…

CVE-2022-24124

根据提示 访问api/get-organizations salmap和手工注入都不行&#xff0c;使用substring() 查库&#xff0c;查到有4个库 ?p1&pageSize10&valuee99nb&sortField&sortOrder&field (substring((select count(schema_name) from information_schema.sche…