事务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 /*恢复默认值* 没恢复啊/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!