数据库事务与ACID
数据库事务正确执行的四个基本要素。
-
原子性
一次事务是不可分割的工作单位,事务中的所有操作要么都发生,要么都不发生。
-
一致性
事务的前后数据完整性必须一致。
-
隔离性
多个用户并发访问数据库时,数据库为每一个用户开启的事务互相隔离,互不干扰。
-
持久性
一个事务一旦被提交,它对数据库中数据的改变就是不可逆的,即使数据库故障导致宕机也不会对其有任何影响。
隔离产生的问题
脏读
简单来说就是一个事务读取到了另一个事务未提交的数据。
1.事务A对数据库进行更新,更新了一条数据。
2.在事务A更新数据时,事务B对数据库进行读取,读取到了事务A更新后的数据。
3.事务A取消了更新,数据库回滚到事务A更新前。导致事务B读取到了一条并不存在的数据。
不可重复
即一个事务在读取数据时,另一个事务修改了数据并已提交,则导致多次读取数据时数据发生变动。
1.事务A读取数据库中的数据。
2.事务B更新了数据库中的数据,导致事务A第二次读取时数据发生改变。
不可重复并不一定是错误,有可能只是巧合。
幻读
即一个事务在读取数据时,另一个事务插入了新的数据并已提交,则导致多次读取数据时数据发生变动。
1.事务A读取数据库中的数据。
2.事务B在数据库中新插入了一行数据,导致事务A第二次读取时数据发生改变。
幻读一般针对行影响,多一行或者少一行,同不可重复一样,不一定是错误。
手动提交事务
在Mysql中,事务是自动提交的。
SET autocommit = 0;
#关闭事务自动提交
SET autocommit = 1;
#开启事务自动提交
手动提交事务的流程:
SET autocommit = 0;
#关闭事务自动提交
START TRANSACTION
#事务开启
...
...
#事务内容
COMMIT
#提交事务,或者
ROLLBACK
#回滚
SET autocommit = 1;
#开启自动提交
创建一个数据表:
CREATE DATABASE bank CHARACTER SET utf8 COLLATE utf8_general_ci;
USE bank;
CREATE TABLE `shop`(
`id` INT(3) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
插入两行数据:
INSERT INTO `shop`(`name`,`money`) VALUE('张三',2000.00),('李四',500.00);
模拟转账:
SET autocommit = 0;
#关闭自动提交事务
START TRANSACTION;
#事务开启
UPDATE `shop` SET `money`=`money`-200 WHERE `name` = '张三';
UPDATE `shop` SET `money`=`money`+200 WHERE `name` = '李四';
#事务内容
COMMIT;
#提交事务
ROLLBACK;
#回滚
SET autocommit = 1;
#开启自动提交
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人