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

相关推荐
m0_4665252918 分钟前
绿盟科技风云卫AI安全能力平台成果重磅发布
大数据·数据库·人工智能·安全
爱学习的阿磊1 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python
枷锁—sha1 小时前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
惜分飞1 小时前
ORA-600 kcratr_nab_less_than_odr和ORA-600 4193故障处理--惜分飞
数据库·oracle
chian-ocean1 小时前
CANN 生态进阶:利用 `profiling-tools` 优化模型性能
数据库·mysql
m0_550024631 小时前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
AC赳赳老秦1 小时前
代码生成超越 GPT-4:DeepSeek-V4 编程任务实战与 2026 开发者效率提升指南
数据库·数据仓库·人工智能·科技·rabbitmq·memcache·deepseek
啦啦啦_99992 小时前
Redis-2-queryFormat()方法
数据库·redis·缓存
玄同7652 小时前
SQLite + LLM:大模型应用落地的轻量级数据存储方案
jvm·数据库·人工智能·python·语言模型·sqlite·知识图谱
吾日三省吾码2 小时前
别只会“加索引”了!这 3 个 PostgreSQL 反常识优化,能把性能和成本一起打下来
数据库·postgresql