Mysql事务
Mysql事务
mysql事务定义
事务:事务是并发控制的基本单元,事务是一个操作序列,要么都执行,要么都不执行,他是一个不可分割的工作单位,事务是维护数据库一致性的单位。
事务的四大特性:原子性,一致性,隔离性,持久性
- 原子性,一个事务是一个原子性的操作,那么一个事务要么成,要不就不成
- 一致性,在操作的前后数据总量不变,并且合法的数据才能被写入
- 隔离性,隔离性主要是多个用户可以并发访问,相互之间是隔离的
- 持久性,是代表数据的操作在提交结束以后那么操作的结果是持久的,数据的操作结果要得到固化。
事务的隔离性
多次读取并发中出现的问题
-
脏读:就是一个事务在读取事务在处理的过程中,还在处理并没有提交,另外一个事务就读取了该事务,那么肯定是是不行的(例如:小明在存款的过程中,继续了另外一个事务查询存款,查询到已经存储成功,但是后面存储人员信息出现问题,倒置没有存储成功,那么查询已经成功了就出现了问题)
-
不可重复读:是指一个事务执行两次那么两个的数据是不同的,一个事务执行两次查询返回了不同的结果,其中的原因是因为在第一个事务在执行第一次和第二次查询的过程中。另外一个事务对数据进行了修改
-
幻读:是指一个事务连续两次查询一个范围内的结果,出现的数量不同。(其中一个原因是因为在读取的过程中由于在第一次查询中第二次查询后会多一行数据的情况,并且没有说两次查询是在同一个事务当中)
事务的四个隔离级别
-
读未提交(Read UnCommitted)
这里顾名思义,读未提交就是对于一个事务在未提交的过程中就被读到。
例如:老婆给老公转300元,转错了转成500元,但是还没转就被老公看见很高兴,能多得到钱,但是妻子发现后改成300元这时老公还不知道。
因此这种的方式会存在脏读,幻读,以及不可重复读的问题。 -
读提交(Read commit)
读提交顾名思义,就是只能读取已经提交的数据。是sqlserver以及oracle的方式。
例如其实去买零食花100元,但是妻子从他的账户要转出两百买菜,原本他发现自己账户里面有200,但是买零食的时候发现钱不够了。零钱变成了0。
这种方式有效的解决了脏读的问题,但是存在不可重复读,以及幻读的问题。 -
可重读读(Repeated read)
这里采用的可重复读的意义是当一个查询开启的时候其他的update的操作不可以进行,是Mysql的常用的方式。
例如:男子用100元零花钱去买零食,那么着时候他的老婆再想再账户里面拿钱去买菜是不可以的。
但是会这种情况会出现幻读的情况。
例如:他老婆查询到他是花了100买零食,但是于此同时他有花了100买了青菜,当她老婆打印消费单的时候会发现雄消费是200元。 -
序列化(serialized)
这种方式是将所有的操作当成一个序列来进行处理。但是这种方式效率特慢一般不会采用这种方式。
例如:老公买零食----》妻子查账-----》老公买水果------》妻子打印账单
解决方式
幻读产生的原因
主要是由于在读的过程中有其他的插入的操作所导致。
- 在快照读的情况下采用MVCC的模式
- 在当前读的情况下采用Next-key的方式来进行加锁。
原文地址:https://www.cnblogs.com/xinyu520/p/15024849.html
- Spring-Blog:个人博客(一)-Mybatis 读写分离
- Spring-boot:5分钟整合Dubbo构建分布式服务
- MYSQL5.6优化器的一个新特性MMR
- Mysql聚集索引和非聚集索引
- Spring-Boot:6分钟掌握SpringBoot开发
- Zookeeper-5分钟快速掌握分布式应用程序协调服
- Mysql索引长度计算
- Spring-Boot:Spring Cloud构建微服务架构
- Python-WXPY实现微信监控报警
- MySQL InnoDB Lock(一)
- Java 时间类-Calendar、Date、LocalDate/LocalTime
- Java消息队列--JMS概述
- Java FtpClient 实现文件上传服务
- Java消息队列--ActiveMq 实战
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 栈论 : 递归与栈式访问,如何用栈实现所有递归操作(幼儿园题目篇,题目2)
- SQL注入原理及代码分析(一)
- SQL注入原理及代码分析(二)
- 写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出 现的次数。
- SSRF漏洞简单分析
- 树莓派基础实验30:BMP180气压传感器实验
- DC-1靶机实战和分析
- 如何用Python优雅的登录校园网?
- PHP入门之类型与运算符
- 栈论 : 递归与栈式访问,如何用栈实现所有递归操作(幼儿园题目篇,题目3)
- Maven是什么? Maven的概念+作用+仓库的介绍+常用命令
- JDK8;HashMap:再散列解决hash冲突 ,源码分析和分析思路
- 写一个 Singleton
- 树莓派基础实验31:MPU6050陀螺仪加速度传感器实验
- springboot gradle mybatis mysql配置(注解)