MySQL事务与隔离级别的使用基础理论
来源:脚本之家
时间:2023-02-25 09:47:02 364浏览 收藏
哈喽!今天心血来潮给大家带来了《MySQL事务与隔离级别的使用基础理论》,想必大家应该对数据库都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到mysql事务、隔离级别,若是你正在学习数据库,千万别错过这篇文章~希望能帮助到你!
什么是事务
事务就是一组操作的集合,事务将整组操作作为一个整体,共同提交或者共同撤销
这些操作只能同时成功或者同时失败,成功即可提交事务,失败就执行事务回滚
MySQL的事务默认是自动提交的,一条语句执行成功,MySQL将会隐式的提交事务
以转账为例,张三向李四转账1000元
这个整体行为包含三个操作:首先查询张三账户的余额,其次将张三账户余额-1000,最后将李四账户余额+1000。事务就是将这三个操作看作最小提交单元,就是一荣俱荣一损俱损。
-- 查看事务管理状态 1-自动 0-手动 select @@autocommit; -- 设置事务手动管理 set @@autocommit = 0; -- 开启事务 start transaction; -- 开启事务:start transaction 或者 begin select money from account where name = '张三'; update account set money = money - 1000 where name = '张三'; update account set money = money + 1000 where name = '李四'; -- 事务提交 commit; -- 事务回滚 rollback;
事务四大特性ACID
原子性Atomicity:一组操作为最小执行单元,只能全部执行成功或者全部失败
一致性Consistency:事务完成后,所有数据都要保持一致状态
一致性表示事务完成后,数据操作前后符合逻辑运算,状态一致
隔离性Isolation:是指在并发操作数据库时,各个事务之间不会相互影响
持久性Durability:事务一旦提交或回滚,对于数据库的修改将会永久保存
并发事务问题
脏读
两个事务A和B在并发下操作数据库中的同一数据时,当事务A对数据进行了修改但是还没有commit的同时,事务B对该数据进行了select,此时事务B读取到的数据就是不准确的。这种情况叫做脏读
事务B读取到了事务A修改但还未提交的数据---->脏读
不可重复读
同样事务AB并发下操作数据库中同一数据,首先事务A对该数据进行查询,查询之后又进行了其他操作。与此同时,事务B执行了更新操作并且成功commit。那么当事务A再次对数据库查询的时候就会出现与上次读取到的数据不一致的情况
幻读
事务AB并发下操作数据库中同一数据,事务A首先查询了数据库中是否有id=1的数据,没有就插入。那么此时事务A未查询到该数据存在,同时事务B执行了插入操作插入了id=1的数据并且提交。那么事务A再去插入的时候则会报主键冲突的错误,但是当事务A再一次去查的时候发现id=1的数据仍然是不存在( 前提是已经解决了不可重复读的问题,一个事务多次访问同一数据的结果是一致的 ),这种情况就称之为幻读
事务隔离级别
隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted(读未提交) | × | × | × |
Read committed(oracle默认)(读已提交) | √ | × | × |
Repeatable Read(mysql默认)(可重复读) | √ | √ | × |
Serializable(可序化) | √ | √ | √ |
× --> 无法解决 √ --> 可以解决
在sql中查看当前事务隔离级别
select @@transaction_isolation;
设置当前事务隔离级别
-- 设置事务隔离级别 set [session|global] transaction isolation level {Read uncommitted | Read committed | Repeatable Read |Serializable};
session是指尽在当前会话中使用该事务隔离级别,global表示全局有效
四种事务隔离级别当中,Serializable可序化级别最高。要求序列化执行sql指令,事务只能一个接一个的执行,不允许并发执行。性能低下
而Read Uncommitted读未提交性能最好,但是存在脏读问题等
今天关于《MySQL事务与隔离级别的使用基础理论》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
-
257 收藏
-
448 收藏
-
352 收藏
-
378 收藏
-
311 收藏
-
467 收藏
-
303 收藏
-
176 收藏
-
368 收藏
-
475 收藏
-
266 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习