当前位置: 首页 > news >正文

MYSQL数据库(四)

四、事务

1.概念

在一个业务逻辑中包含多个步骤操作,需要被事务进行管理,要么同时成功,要么同时失败 

默认提交事务

2.语法

关闭默认提交事务:set autocommit = 0;

手动提交:commit;

手动回滚:rollback; 

开启默认提交事务:set autocommit = 1;

3.事务的四大特性

原子性事务包含的所有数据库操作要么全部成功,要不全部失败回滚

一致性一个事务执行之前和执行之后都必须处于一致性状态

隔离性一个事务未提交的业务结果是否对于其它事务可见

持久性一个事务一旦被提交了,那么对数据库中数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作

4.事务的隔离级别

Read uncommitted 读未提交

产生问题:脏读、不可重复读、幻读

提供了事务建最小限度的隔离,就是一个事务可以读取另一个未提交事务的数据。

示例:小明去商店买衣服,付款的时候,小明正常付款,钱已经打到商店老板账户,但是小明发起的事务还没有提交。就在这时,商店老板查看自己账户,发现钱已到账,于是小明正常离开。小明在走出商店后,马上回滚差点提交的事务,撤销了本次交易曹邹。

结果:小明未付钱买到了衣服,商店老板实际未收到小明的付款。

分析:商店老板查看自己的资金账户,这个时候看到的是小明还没有提交事务的付款,这就是脏读

注意:处于该隔离级别的事务AB,如果事务A使用事务B不提交的变化作为计算的基础,然后哪些未提交的变化被事务A撤销,这就导致了大量的数据错误变化

Read committed 读已提交(Oracle数据库默认的隔离级别)

产生问题:不可重复读、幻读

处于Read committed (读已提交)级别的事务可以看到其他事务对数据的修改,在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的同一sql在其他事务执行前后返回的是不同的结果。一个事务要等另一个事务提交后才能读取数据。

示例:小明卡里有1000元,准备与几个朋友聚餐消费,消费1000元,当他买单时(事务开启),收费系统检测到他卡里有1000元。就在检测完毕的时候,小明女朋友发现小明有私房钱,全部转走并提交。当收费系统准备扣款时,再检查小明卡里的金额,发现已经没钱了,付款不成功。小明此时就会很纳闷,明明有钱的呀,钱呢?

分析:该示例中同一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读,该隔离级别可以解决脏读问题

Repeatable read 可重复读(Mysql数据库默认的隔离级别)

产生问题:幻读

在开始读取数据(事务开启)时,不再允许修改操作

示例:还是小明有1000元,准备跟朋友聚餐消费这个场景,当他买单(事务开启)时,收费系统检测到他卡里有1000元,这个时候,他的女朋友不能转出金额。接下来,收费系统就可以扣款成功了,小明醉醺醺的回家,准备跪脱衣板。

分析:重复读可以解决不可重复读的问题

什么情况下产生幻读呢?

示例: 小明在公司上班,女朋友告诉他,拿着他的卡去逛街消费。花了一千元,然后小明去查看他银行卡的消费记录(事务开启),看到确实是花了一千元。就在这个时候,小明女朋友又花三千元买了一些化妆品和衣服,即新增了一些消费记录。当小明打印自己银行卡消费记录单的时候(女朋友事务提交),发现花了四千元,似乎出现了幻觉,小明很心疼。这就是幻读

Serializable串行化

解决所有问题

注意点: 隔离级别越高,性能越低

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JavaScript学习文档(11):Window对象、本地存储、数组中一些方法、学生就业统计表案例
  • 15行为型设计模式——责任链模式
  • Java基础入门【第六章 static、继承、重写、多态】(二)
  • 数据合规性分析:守护信息安全的关键防线
  • MySQL的安装配置以及可视化工具的安装
  • 【拉取Git项目到本地,知识小记,后续再改】
  • 春秋云镜initial
  • 宏集MIRO-L230工业路由器: 一站式全球联网解决方案
  • C++ 图形框架 Duilib
  • UE5学习笔记18-使用FABRIK确定骨骼的左手位置
  • 安装vue-cli2.0并创建项目
  • 实习项目|苍穹外卖|day2
  • jenkins安装k8s插件发布服务
  • rsync搭建全网备份
  • 实训第三十一天(playbook)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • golang 发送GET和POST示例
  • input的行数自动增减
  • JavaWeb(学习笔记二)
  • Java教程_软件开发基础
  • LintCode 31. partitionArray 数组划分
  • Node 版本管理
  • node入门
  • Vue官网教程学习过程中值得记录的一些事情
  • 从setTimeout-setInterval看JS线程
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 每天一个设计模式之命令模式
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 正则表达式
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • (16)Reactor的测试——响应式Spring的道法术器
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (poj1.3.2)1791(构造法模拟)
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (四) 虚拟摄像头vivi体验
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • *p++,*(p++),*++p,(*p)++区别?
  • .ai域名是什么后缀?
  • .Mobi域名介绍
  • .NET C# 使用GDAL读取FileGDB要素类
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET是什么
  • .NET项目中存在多个web.config文件时的加载顺序
  • .py文件应该怎样打开?
  • /etc/skel 目录作用
  • @拔赤:Web前端开发十日谈
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [AIGC] SQL中的数据添加和操作:数据类型介绍