事务ACID原则

事务的ACID原则

  • 原子性(Atomicity):是指一个事务要么全部执行,要么不执行,也就是说一个事务不可能只执行了一半就停止了。
  • 一致性(Consistency):是指事务的运行并不改变数据库中数据的一致性。
  • 持久性(Durability):是指事务执行成功以后,该事务对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚。
  • 隔离性(Isolation):是指两个以上的事务不会出现交错执行的状态。因为这样可能会导致数据不一致,更加具体的来讲,就是事务之间的操作是独立的。

隔离所导致的一些问题

脏读:指一个事务读取了另外一个事务回滚前的数据

不可重复读:在一个事务内多次读取表中的某一行数据,因期间另一个事务对记录进行了修改,所以多次读取结果不同(这个不一定是错误的,只是某些场合不对)

虚度(幻读):一个会话事务重复读取相同条件范围的记录,期间另一个会话因添加或修改使得范围内记录发生变化,而返回结果不同

提醒:不可重复读的重点是修改:同样的条件,你读取过的数据,再次读取出来发现值不一样了

   幻读的重点在于新增或者删除:同样的条件,第 1 次和第 2 次读出来的记录数不一样

 

为解决上述问题,数据库通过锁机制解决并发访问的问题

数据库给用户提供了不同的事务隔离级别

隔离级别 脏读 不可重复读 幻读
read uncommited(读未提交) 允许 允许 允许
read commited(不可重复读) 不允许 允许 允许
repeatable read(可重复读) 不允许 不允许 允许
serializable(序列化) 不允许 不允许 不允许

 

 

复制代码
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop

CREATE TABLE account(
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(10) NOT NULL,
    `money` DECIMAL(9,2) NOT NULL,
    PRIMARY KEY(id)
)ENGINE = INNODB DEFAULT CHARSET=utf8

 INSERT INTO account (`name`,`money`) VALUES ('A',2000),('B',10000)
 
 --模拟转账:事务
 SET autocommit = 0;  --关闭自动提交
 START TRANSACTION   --开启一个事务
 
 UPDATE account SET money = money-500 WHERE `name`='A'    /*A减五百*/
 UPDATE account SET money = money+500 WHERE `name`='B'    /*B加五百*/
 
 COMMIT; /*提交事务,就被持久化了*/
 ROLLBACK;  /*回滚*/
 
 SET autocommit = 1  /*恢复默认值*  没恢复啊/
复制代码

 

posted @   长空扯淡  阅读(212)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示