谷歌认证合作伙伴网站建设,东莞企业建站程序,dedecms制作网站地图,在线网页代理pc事务 详解 一. 为什么使用事务二. 事务的概念三. 使用四. 事务的特性原子性#xff08;Atomicity#xff09;一致性#xff08;Consistency#xff09;隔离性#xff08;Isolation#xff09;持久性#xff08;Durability#xff09; 五. 事务并发所带来的问题脏读问题… 事务 详解 一. 为什么使用事务二. 事务的概念三. 使用四. 事务的特性原子性Atomicity一致性Consistency隔离性Isolation持久性Durability 五. 事务并发所带来的问题脏读问题不可重复读幻影读 六. 事务隔离级别 一. 为什么使用事务
假如说你要进行转账 比如转给 张三 50元先从你的账户里面扣除 50 准备给 张三账户 50 时数据库由于种种原因 挂了没加上此时 50 元 凭空消失了 那么这就是一个比较悲伤的故事了这种事情当然不能发生。
drop table if exists accout;
create table accout(id int primary key auto_increment,name varchar(20) comment 账户名称,money decimal(11,2) comment 金额
);insert into accout(name, money) values(阿里巴巴, 5000),(四十大盗, 1000);比如说四十大盗把从阿里巴巴的账户上偷盗了2000元
-- 阿里巴巴账户减少2000
update accout set moneymoney-2000 where name 阿里巴巴;-- 四十大盗账户增加2000
update accout set moneymoney2000 where name 四十大盗;假如执行完第一句SQL时出现网络错误或是数据库挂掉了阿里巴巴的账户会减少2000但是四十大盗的账户上没有增加金额。
解决方案使用事务来控制保证以上两句SQL要么全部执行成功要么全部执行失败。
二. 事务的概念
事务: 指逻辑上的一组操作组成这组操作的各个单元要么全部成功要么全部失败。事务的目的 把若干个独立的操作打包成一个整体这个整体要么全部成功执行 要么一点都不执行。
在不同的环境中都可以有事务。对应在数据库中就是数据库事务。
有时前一个 SQL 是为了给后一个 SQL 提供支持若后一个 SQL 不执行或者执行出现问题了 前一个 SQL 也就失去意义了。
三. 使用
1开启事务start transaction; 2执行多条SQL语句 3回滚或提交rollback/commit; 说明rollback即是全部失败commit即是全部成功。
start transaction;-- 阿里巴巴账户减少2000
update accout set moneymoney-2000 where name 阿里巴巴;
-- 四十大盗账户增加2000
update accout set moneymoney2000 where name 四十大盗;commit;四. 事务的特性
ACID Atomicity 原子性 Consistency 一致性 Isolation 隔离性 Durability 持久性
原子性Atomicity
原子性: 任务不能被再细分事务要么全部成功执行要么一点也不执行不会出现中间状态。比如上面的转账例子 不会出现 A账户 -2000, 结果数据库崩了/程序崩了/断电了, B 的账户并没有 2000 而导致的中间状态。
原子性如何保证 该执行还得执行 无法预知失败。 当出现执行失败后由数据库自动进行一些 “还原” 回滚rollback工作 消除前面 已经执行过 的 SQL 带来的影响使得看起来与没有执行一样。
比如 当执行第二个 SQL 出现失败时数据库会还原之前的操作上一个是 那么就 - 是 * 就 / 。
数据库如何知道还原成哪个值呢
日志 数据库会把执行数据库的每个操作记录下来整个记录过程搭配了 日志数据库内置的一些表 来完成。
既然能还原是不是就可以大胆的删库 了 数据库想要记录详细的操作需要消耗大量的时间和空间所以这个记录一定不会存储那么久可能数据库是经过好几年沉淀出来的结果但是日志只是记录最近几天的所以还得依赖 权限控制 和 数据备份。
一致性Consistency
事务在执行前后数据库从一个一致的状态转换到另一个一致的状态。这意味着事务必须遵循预定义的规则和约束以确保数据的完整性。 如果事务违反了任何约束它将被回滚数据库不会处于不一致的状态。
隔离性Isolation
隔离性指的是多个事务同时运行时每个事务都应该被视为独立的不应该受到其他事务的干扰。 这意味着在并发执行的情况下一个事务的操作不会对其他事务产生影响直到事务提交为止。 数据库系统使用锁和其他机制来实现隔离性。
持久性Durability
持久性确保一旦事务提交成功其结果将永久保存在数据库中即使系统发生故障或重启。这意味着事务的结果不会因为系统崩溃而丢失数据库系统必须将数据持久地写入磁盘或其他持久存储介质中。
总结 事务的四个特性确保了数据库事务的可靠性和一致性使得数据库系统能够有效地管理并发操作同时保护数据免受损坏或丢失。但严格的ACID特性有时会对性能产生一定的开销因此在某些情况下可能需要权衡ACID特性与性能之间的关系。
五. 事务并发所带来的问题
并发: 包含并行和广义的并发。当并发执行多个事务时 尤其当这多个事务在尝试修改/读取同一份数据时容易出现一些问题。 事务的隔离级别就是在解决该问题。
脏读问题
事务 A 在对某个数据进行修改修改的时候事务 B 读取了这个数据此时事务 B 读取到的很可能只是一个临时的中间结果不是最终结果 那么此时 B 就是读到了 “脏数据”。
出现脏读的原因 事务和事务之间没有隔离加上一些限制就可有效避免脏读。
解决脏读 给写操作加锁修改过程中 不允许别人读 修改之后才能读解锁。 注意一旦加锁 事务之间隔离性提高 并发度降低
不可重复读
不可重复读问题: 在一个事务中包含多次读操作多次读操作读出来的结果不一致解决脏读问题时只是约定写加锁 写时不能读 但是 读时还能写所以还存在不可重复读问题。 这个问题好比通过码云读代码读的时候别人修改并提交了我们刷新一下代码变了。
解决 约定读时也加锁读时不能进行修改操作 读时其他事务能读但不能修改。 事务的隔离性进一步提高并发性进一步降低
幻影读
幻读问题: 一个事务执行过程中进行多次查询多次查询的结果集不一样
结果集多了这是一种特殊的不可重复读问题。本例就是读代码时代码数量变了本来只有一个 A.java, 后面读取的时候发现又多了 B.java
注意 幻读出现的场景
第一事务的隔离级别为可重复读。
第二幻读仅专指新插入的行在范围查询中后一次查询出现了新的数据行。 因为数据库中原本没有这个数据当然就无法加锁了所以会出现新的数据 而因为读时不能写所以不会删除数据。
解决 彻底串行化读的时候不要写任何代码。 但是在MySQL的InnoDB引擎中通过间隙锁gap lock行锁组成的next-key lock在可重复读级别下解决了幻读的问题。参考链接前阿里数据库专家总结的MySQL里的各种锁下篇
串行化隔离级别最高并发度最低其实已经串行化没有并发了数据最可靠但是执行速度最慢。
所以并发性和隔离性不可兼得。 可根据实际需要调整数据库隔离级别通过不同的隔离级别控制事务间的隔离性和并发程度。
六. 事务隔离级别 MySQL 默认隔离级别为 repeatable read, 通过修改 my.ini 文件可以设置当前隔离级别。
好啦 以上就是对 MySQL 事务的讲解 希望能帮到你 评论区欢迎指正