数据库事务与ACID

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;
#开启自动提交

 

这里的事务内容,两条UPDATE语句就是一组事务。

posted @   乌鸦の学习  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示