数据库事务及ACID
数据库事务是指作为单个逻辑工作单元执行的一组操作。这组操作要么全部成功地执行,要么全部不执行,不允许出现部分执行的情况。数据库事务通常需要满足ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
ACID属性详解:
原子性(Atomicity):
原子性要求事务是不可分割的单元,要么全部执行,要么全部不执行。如果事务中的任何一步失败,整个事务都会被回滚到初始状态。
一致性(Consistency):
一致性确保事务执行后数据库从一个一致性状态转移到另一个一致性状态。即,事务应满足所有的约束和触发器,保持数据库的完整性。
隔离性(Isolation):
隔离性指的是多个事务并发执行时,每个事务的操作应该与其他事务隔离,互不干扰。隔离性可通过锁定机制来实现,以确保并发执行不导致数据不一致。
持久性(Durability):
持久性要求一旦事务被提交,其结果就应该是永久性的,即使系统故障也不应该导致数据丢失。
设置/禁止自动提交:
在数据库中,自动提交是指每个SQL语句都被当做一个事务并自动提交。在很多情况下,我们可能需要禁止自动提交,以便将一系列的SQL语句作为一个事务进行执行。
SQL Server:
-- 禁止自动提交
SET IMPLICIT_TRANSACTIONS ON;
-- 启用自动提交
SET IMPLICIT_TRANSACTIONS OFF;
MySQL / MariaDB:
-- 禁止自动提交
SET AUTOCOMMIT = 0;
-- 启用自动提交
SET AUTOCOMMIT = 1;
Oracle:
-- 禁止自动提交
SET AUTOCOMMIT OFF;
-- 启用自动提交
SET AUTOCOMMIT ON;
事务示例:
考虑一个简单的银行应用场景,其中执行了两个相关的SQL语句:
-- 禁止自动提交
SET AUTOCOMMIT = 0;
-- 开始事务
BEGIN;
-- 转账操作
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- 提交事务
COMMIT;
在上述示例中,如果任何一个UPDATE语句失败,整个事务将被回滚,从而保持数据的一致性。禁止自动提交使得事务成为一个原子操作,要么完成,要么回滚。