事务(transaction)

事务管理(acid)

  • Atomicity(原子性):
    一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • Consistency(一致性):
    在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  • Isolation(隔离性):
    数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • Durability(持久性):
    事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

隔离所导致的一些问题

  • 脏读
    读到了别人还没提交的数据,结果别人回滚了,你读到的就是 “脏数据”。
    场景:
    事务 A 把某条数据改成 100,但还没提交
    事务 B 立刻读到了 100
    事务 A 出错,回滚,数据变回原来的值
    事务 B 手里拿着的 100 就是脏数据
  • 不可重复读
    同一个事务内,两次读同一条记录,结果不一样。
    场景:
    事务 A 第一次读某条数据,值是 50
    事务 B 修改这条数据并提交
    事务 A 在同一个事务内再次读,变成 60
  • 虚读(幻读)
    同一个事务内,两次查询范围,结果多 / 少了几条记录(像幻觉一样)。
    场景:
    事务 A 查询 “年龄 = 18” 的记录,共 10 条
    事务 B 插入一条新的年龄 = 18 的记录并提交
    事务 A 再次查询,变成 11 条

事务大致流程

-- mysql是默认开启事务自动提交的
SET autocommit =0 -- 关闭
SET autocommit =1 -- 开启(默认)

-- 手动处理事务
SET autocommit =0 -- 关闭自动提交

-- 事务开启
START TRANSACTION -- 标记一个事务的开始,从这之后的sql都在同一个事务内

INSERT xx
INSERT xxx

-- 提交 持久化(成功!)
COMMIT
-- 回滚 回到原来的样子 (失败!)
ROLLBACK

-- 事务结束
SET autocommit =1 -- 开启自动提交

SAVEPOINT 保存点名-- 设置一个事物的保存点
ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名 -- 撤销保存点
 

转账例子

create database shop character set utf8mb4 collate utf8mb4_0900_ai_ci -- 新建数据库shop
use shop
create table `account`(
	`id` int not null auto_increment,
	`name` varchar(20) not null,
	`money` decimal(9,2) not null, -- 9位有效数字,小数点后两位
	primary key (`id`)
)engine = innodb default charset =utf8mb4 -- 创建表account

insert into `account`(`name`,`money`) 
value('A',2000 ),('B',10000)

set autocommit =0;

update `account` set money=money-500 where `name` ='A';
update `account` set money=money+500 where `name` = 'A';
-- 转账操作实现

-- commit; 事务提交,就被持久化了
-- rollback;回滚

set autocommit = 1; -- 设置默认值

相见时难别亦难,东风无力百花残

posted @ 2026-04-07 21:14  编程小猴  阅读(23)  评论(0)    收藏  举报