【数据库】关系数据库管理系统 (RDBMS) 中事务处理的四个特性ACID

给自己一个目标,然后坚持一段时间,总会有收获和感悟!
数据库事务是指一组数据库操作(例如插入、更新、删除等),被视为一个单独的逻辑操作单元,并且要么全部执行成功,要么全部不执行,也不会执行部分操作。在执行期间,要么取得所有所需要的资源,要么都不取得任何资源,以确保数据的一致性、完整性和可靠性。

在这里插入图片描述

一、事务四个特性

数据库事务具有四个特性,通常称为 ACID 特性

1.1、原子性

原子性(Atomicity),一个事务中的所有操作要么全部执行,要么全部不执行,不会有部分成功和部分失败的情况。

1.2、一致性

一致性(Consistency),事务执行的结果应该符合数据库的约束条件和逻辑。

1.3、隔离性

隔离性(Isolation),并发执行的多个事务相互独立,不会相互干扰。每个事务应该只能看到其自身提交之前的数据。

1.4、持久性

持久性(Durability),事务提交后所做的修改应该永久地保存到数据库中,并且即使在数据库崩溃等异常情况下,修改也不应该丢失。

为了保证事务的原子性和一致性,通常使用“回滚”和“提交”来控制事务状态。
数据库事务在应用程序中通常采用事务控制命令(如 BEGIN TRANSACTION、COMMIT TRANSACTION 和 ROLLBACK TRANSACTION)来实现。
事务的设计和实现需要考虑到多方面的因素,如访问控制、并发控制、锁定、日志记录、备份和恢复等问题。
不同的数据库系统会针对这些问题提供不同的解决方案,因此数据库事务功能的实现具有相当的复杂性和灵活性。

二、代码举例

在 Sql Server 中,可以使用 Transact-SQL (T-SQL) 语言编写具体实现 ACID 特性的事务代码,

  • 示例如下
    BEGIN TRANSACTION --开启一个事务
    INSERT INTO Customers (CustomerName, ContactName, City, Country)
    VALUES (‘Alfreds Futterkiste’, ‘Maria Anders’, ‘Berlin’, ‘Germany’)

    UPDATE Suppliers
    SET ContactName = ‘Christina Berglund’
    WHERE SupplierName = ‘Alfreds Futterkiste’

COMMIT TRANSACTION --提交事务,以上两条 SQL 语句构成一个事务。

以上代码中的 BEGIN TRANSACTION 和 COMMIT TRANSACTION 标记了一个事务的开始和结束,同时在这个事务中包含了两条 SQL 语句,即插入一条数据和更新一条数据。
如果这个事务执行过程中出现了异常,比如 SQL 语句格式错误或者数据库连接中断等情况,那么事务就会回滚到初始状态,保证了事务的原子性和一致性。
在一个并发访问的数据库系统中,这样的实现可以保证事务的隔离性和持久性。

三、事务相关操作

除了上述示例中的基本事务操作外,还有其他一些常用的事务相关操作,

3.1、回滚事务

回滚事务(ROLLBACK TRANSACTION),在事务执行过程中,如果发生了错误或者需要撤销事务的操作,可以使用
ROLLBACK TRANSACTION 命令回滚事务,将事务中的所有修改操作都撤销回滚到事务开始前的状态。

3.2、保存点

保存点(SAVEPOINT),在事务中设置保存点,可以在事务执行过程中对部分操作进行分组,以便于根据需要回滚到保存点所标记的位置。
当事务中的某部分操作出现错误时,可以使用 ROLLBACK TRANSACTION SavePointName 命令回滚到保存点所处的位置。

3.3、独立的连接

独立的连接(Isolated Connections),在某些情况下,多个事务可能需要在独立的数据库连接中执行,这样可以提供更高的隔离级别。
每个事务可以使用一个单独的数据库连接,这样可以避免在某个事务中影响到其他事务。

3.4、并发控制与锁定

并发控制与锁定(Concurrency Control and Locking),为了保证事务的隔离性,数据库系统使用并发控制机制和锁定来协调多个事务对共享资源的访问。
在 Sql Server 中,可以使用锁定机制(如共享锁、排他锁等)来控制并发事务之间的互斥和顺序执行。

通过结合以上的事务操作和并发控制机制,可以在 Sql Server 数据库中实现更复杂的事务处理逻辑,并满足 ACID 特性。
具体的实现方式会根据具体的业务需求和数据库模型而有所不同。

四、共享锁

共享锁(Shared Lock)是数据库中的一种锁定机制,用于实现并发事务的读取操作。当一个事务获取了共享锁后,其他事务也可以获取该数据的共享锁,以允许它们同时读取相同的数据。

4.1、特点

1)多个事务可以同时持有共享锁,以允许并发读取操作。
2)共享锁不允许其他事务对数据进行修改,保护数据的一致性和完整性。
3)共享锁是一种共享资源,多个事务可以同时持有,但在一个事务持有共享锁的同时,其他事务无法获得排它锁。

4.2、代码举例

下面是一个示例,展示了如何使用共享锁(Shared Lock)来对数据进行并发读取

-- 共享锁示例
BEGIN TRANSACTION

-- 申请共享锁
SELECT * FROM Customers WITH (HOLDLOCK, ROWLOCK) WHERE City = 'guangzhou'

-- 执行一些读操作

COMMIT TRANSACTION

在上述示例中,SELECT 语句中添加了锁定提示(Lock Hints)HOLDLOCKROWLOCKHOLDLOCK 表示在整个事务期间保持锁定,ROWLOCK 表示以行为单位进行锁定。

通过在 SELECT 语句中使用共享锁,多个事务可以同时读取数据,但是不允许其他事务对该数据进行修改。这可以确保在并发读取数据的情况下,数据的一致性和完整性得到保证。

需要注意的是,具体的锁定语法和参数可能因数据库系统而有所不同,所以在实际开发中,请根据使用的数据库系统的文档或官方指南来确定正确的锁定语法和选项。

猜你喜欢

转载自blog.csdn.net/lmy_520/article/details/134196021