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

相关推荐
月光水岸New2 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6752 小时前
数据库基础1
数据库
我爱松子鱼2 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo3 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser4 小时前
【SQL】多表查询案例
数据库·sql
Galeoto4 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)4 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231114 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白4 小时前
PostgreSQL:更新字段慢
数据库·postgresql
敲敲敲-敲代码4 小时前
【SQL实验】触发器
数据库·笔记·sql