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

相关推荐
AAA修煤气灶刘哥9 小时前
后端人速藏!数据库PD建模避坑指南
数据库·后端·mysql
RestCloud13 小时前
揭秘 CDC 技术:让数据库同步快人一步
数据库·api
得物技术16 小时前
MySQL单表为何别超2000万行?揭秘B+树与16KB页的生死博弈|得物技术
数据库·后端·mysql
可涵不会debug20 小时前
【IoTDB】时序数据库选型指南:工业大数据场景下的技术突围
数据库·时序数据库
ByteBlossom20 小时前
MySQL 面试场景题之如何处理 BLOB 和CLOB 数据类型?
数据库·mysql·面试
麦兜*20 小时前
MongoDB Atlas 云数据库实战:从零搭建全球多节点集群
java·数据库·spring boot·mongodb·spring·spring cloud
Slaughter信仰20 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十章知识点问答(10题)
java·jvm·数据库
麦兜*20 小时前
MongoDB 在物联网(IoT)中的应用:海量时序数据处理方案
java·数据库·spring boot·物联网·mongodb·spring
-Xie-21 小时前
Mysql杂志(十六)——缓存池
数据库·mysql·缓存