什么是数据库事务、事务的ACID、怎么设置/禁止自动提交?

数据库事务及ACID

数据库事务是指作为单个逻辑工作单元执行的一组操作。这组操作要么全部成功地执行,要么全部不执行,不允许出现部分执行的情况。数据库事务通常需要满足ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

ACID属性详解:

原子性(Atomicity):

原子性要求事务是不可分割的单元,要么全部执行,要么全部不执行。如果事务中的任何一步失败,整个事务都会被回滚到初始状态。
一致性(Consistency):

一致性确保事务执行后数据库从一个一致性状态转移到另一个一致性状态。即,事务应满足所有的约束和触发器,保持数据库的完整性。
隔离性(Isolation):

隔离性指的是多个事务并发执行时,每个事务的操作应该与其他事务隔离,互不干扰。隔离性可通过锁定机制来实现,以确保并发执行不导致数据不一致。
持久性(Durability):

持久性要求一旦事务被提交,其结果就应该是永久性的,即使系统故障也不应该导致数据丢失。

设置/禁止自动提交:

在数据库中,自动提交是指每个SQL语句都被当做一个事务并自动提交。在很多情况下,我们可能需要禁止自动提交,以便将一系列的SQL语句作为一个事务进行执行。

SQL Server:

sql 复制代码
-- 禁止自动提交
SET IMPLICIT_TRANSACTIONS ON;

-- 启用自动提交
SET IMPLICIT_TRANSACTIONS OFF;

MySQL / MariaDB:

sql 复制代码
-- 禁止自动提交
SET AUTOCOMMIT = 0;

-- 启用自动提交
SET AUTOCOMMIT = 1;

Oracle:

sql 复制代码
-- 禁止自动提交
SET AUTOCOMMIT OFF;

-- 启用自动提交
SET AUTOCOMMIT ON;

事务示例:

考虑一个简单的银行应用场景,其中执行了两个相关的SQL语句:

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语句失败,整个事务将被回滚,从而保持数据的一致性。禁止自动提交使得事务成为一个原子操作,要么完成,要么回滚。

相关推荐
麦聪聊数据9 小时前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_9 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡9 小时前
【MySQL数据库】数据类型与表约束
数据库·mysql
曹牧10 小时前
Oracle EXPLAIN PLAN
数据库·oracle
BD_Marathon10 小时前
SQL学习指南——视图
数据库·sql
活宝小娜10 小时前
mysql详细安装教程
数据库·mysql·adb
贤时间10 小时前
codex 助力oracle ebs 开发
数据库·oracle
秉承初心10 小时前
PostgreSQL 数据性能瓶颈突破实战
数据库·postgresql·oracle
Database_Cool_11 小时前
即席查询(Ad-Hoc)数据库选型:AnalyticDB MySQL 秒级 Ad-Hoc 分析方案
数据库·mysql