首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第4章 数据更新
4-1 数据的插入(INSERT语句的使用方法)
什么是INSERT
INSERT语句的基本语法
列清单的省略
插入NULL
插入默认值
从其他表中复制数据
4-2 数据的删除(DELETE语句的使用方法)
DROP TABLE语句和DELETE语句
DELETE语句的基本语法
指定删除对象的DELETE语句(搜索型DELETE)
4-3 数据的更新(UPDATE语句的使用方法)
UPDATE语句的基本语法
指定条件的UPDATE语句(搜索型UPDATE)
使用NULL进行更新
多列更新
4-4 事务
什么是事务
创建事务
ACID特性
第5章 复杂查询
5-1 视图
视图和表
创建视图的方法
视图的限制① ——定义视图时不能使用ORDER BY子句
视图的限制② ——对视图进行更新
删除视图
5-2 子查询
子查询和视图
子查询的名称
标量子查询
标量子查询的书写位置
使用标量子查询时的注意事项
5-3 关联子查询
普通的子查询和关联子查询的区别
关联子查询也是用来对集合进行切分的
结合条件一定要写在子查询中
第6章 函数、谓词、CASE表达式
6-1 各种各样的函数
函数的种类
算术函数
字符串函数
日期函数
转换函数
6-2 谓词
什么是谓词
LIKE谓词——字符串的部分一致查询
BETWEEN谓词——范围查询
IS NULL、IS NOT NULL——判断是否为NULL
IN谓词——OR的简便用法
使用子查询作为IN谓词的参数
EXIST谓词
6-3 CASE表达式
什么是CASE表达式
CASE表达式的语法
CASE表达式的使用方法
第7章 集合运算
7-1 表的加减法
什么是集合运算
表的加法——UNION
集合运算的注意事项
包含重复行的集合运算——ALL选项
选取表中公共部分——INTERSECT
记录的减法——EXCEPT
7-2 联结(以列为单位对表进行联结)
什么是联结
内联结——INNER JOIN
外联结——OUTER JOIN
3张以上的表的联结
交叉联结——CROSS JOIN
联结的特定语法和过时语法
当前位置:
首页>>
技术小册>>
SQL基础教程(中)
小册名称:SQL基础教程(中)
### 4-4 事务 在数据库管理系统中,事务(Transaction)是一个非常重要的概念,它确保了数据库操作的一致性和完整性。事务处理是数据库管理系统(DBMS)提供的一种机制,用于将一系列操作视为一个不可分割的工作单元。这些操作要么全部成功执行,要么在遇到错误时全部撤销,以保持数据库的一致性状态。本章节将深入探讨事务的基本概念、特性(ACID属性)、管理事务的方法以及事务在SQL中的应用。 #### 4.4.1 事务的基本概念 **定义**:事务是数据库管理系统执行过程中的一个逻辑单位,由一个或多个SQL语句组成,这些语句作为一个整体一起向系统提交,要么全部执行,要么全部不执行。 **目的**:事务的主要目的是维护数据库的完整性,确保即使在系统发生故障的情况下,数据也能保持一致性和准确性。 **应用场景**:事务广泛应用于银行转账、在线购物、库存管理等需要高度数据一致性的场景。 #### 4.4.2 事务的ACID属性 事务的ACID属性是事务处理中至关重要的四个特性,它们分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 1. **原子性(Atomicity)**:事务是数据库中的最小工作单位,不可再分。事务中的所有操作要么全部成功,要么全部失败,不会结束在中间某个环节。如果事务在执行过程中发生错误或被用户取消,那么已经执行的所有操作都将被撤销,数据库回到事务开始前的状态。 2. **一致性(Consistency)**:事务必须使数据库从一个一致性状态变换到另一个一致性状态。这意味着事务的执行结果必须满足所有的预定义规则,包括数据的完整性约束(如主键约束、外键约束等)。 3. **隔离性(Isolation)**:数据库系统提供一定程度的隔离,使得多个事务并发执行时,一个事务的执行不会被其他事务干扰。隔离级别决定了事务之间的可见性和相互影响程度。常见的隔离级别包括读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。 4. **持久性(Durability)**:一旦事务被提交,它对数据库的修改就是永久性的,即使系统发生故障也不会丢失。持久性通常通过数据库系统的恢复机制来保证,如日志文件(Redo Logs)和检查点(Checkpoints)等。 #### 4.4.3 管理事务的SQL语句 在SQL中,管理事务主要通过以下几个语句实现: 1. **BEGIN TRANSACTION** 或 **START TRANSACTION**:用于开始一个新的事务。在事务开始之后,所有执行的SQL语句都将被视为事务的一部分,直到遇到COMMIT或ROLLBACK语句。 2. **COMMIT**:用于提交当前事务,使自事务开始以来对数据库所做的所有修改成为永久性的。一旦执行了COMMIT,就不能再回滚(Undo)这些修改了。 3. **ROLLBACK**:用于撤销当前事务中自事务开始以来所做的所有修改,将数据库恢复到事务开始前的状态。ROLLBACK通常用于处理错误或异常情况,以确保数据的一致性。 4. **SAVEPOINT**:允许在事务中设置保存点,以便在需要时可以回滚到该保存点,而不是整个事务的开始点。这对于处理复杂事务中的部分回滚非常有用。 5. **RELEASE SAVEPOINT**:删除一个之前定义的保存点,但不影响事务的其他部分。 #### 4.4.4 事务的并发控制 在并发环境下,多个事务可能同时访问和修改数据库中的同一数据。为了避免数据不一致和冲突,数据库系统需要实施并发控制机制。并发控制主要包括锁(Locking)和版本控制(Versioning)两种方法。 - **锁**:数据库通过锁机制来控制对数据的并发访问。锁可以分为共享锁(Shared Locks)和排他锁(Exclusive Locks)。共享锁允许多个事务同时读取同一数据,但不允许修改;排他锁则允许事务对数据进行读写操作,但会阻止其他事务对该数据的访问(无论是读取还是写入)。 - **版本控制**:在某些数据库系统中,如基于多版本并发控制(MVCC)的数据库,通过为每个事务维护数据的不同版本来实现并发控制。这种方法可以减少锁的使用,提高并发性能,但可能会增加存储空间的消耗。 #### 4.4.5 事务的应用实例 以下是一个简单的银行转账事务示例,展示了如何在SQL中使用事务来确保数据的一致性: ```sql BEGIN TRANSACTION; -- 假设从账户A转账100元到账户B UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A'; -- 检查转账后账户A的余额是否足够 IF (SELECT balance FROM accounts WHERE account_id = 'A') < 0 THEN ROLLBACK; -- 如果余额不足,则回滚事务 -- 这里可以添加错误处理逻辑 ELSE UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B'; COMMIT; -- 如果一切正常,则提交事务 END IF; -- 注意:上面的IF语句在标准的SQL中并不直接支持,这里仅用于说明逻辑。 -- 在实际应用中,你可能需要使用存储过程或应用程序逻辑来实现类似的检查。 ``` 由于SQL标准本身并不直接支持在单个SQL语句中执行条件判断后的回滚操作,上述示例中的`IF`语句仅用于说明事务控制的逻辑流程。在实际应用中,你可能需要使用存储过程、触发器或应用程序代码来执行类似的逻辑。 #### 4.4.6 总结 事务是数据库管理系统中的一个核心概念,它通过ACID属性保证了数据的一致性和完整性。在SQL中,通过BEGIN TRANSACTION、COMMIT、ROLLBACK等语句可以方便地管理事务。同时,为了处理并发环境下的数据访问冲突,数据库系统还提供了锁和版本控制等并发控制机制。掌握事务的使用和管理对于开发高可靠性和高性能的数据库应用至关重要。
上一篇:
多列更新
下一篇:
什么是事务
该分类下的相关小册推荐:
SQL基础教程(上)
SQL基础教程(下)
高性能的Postgres SQL
PostgreSQL入门教程