mysql事务特性和隔离级别(Mysql事务特性和级别原理解析)
mysql事务特性和隔离级别
Mysql事务特性和级别原理解析一、什么是事务?
数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
二、事务的四大属性
分别是原子性、一致性、隔离性、持久性。
1、原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
2、一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。举例来说,假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何转账、转几次账,事务结束后两个用户的钱相加起来应该还得是1000,这就是事务的一致性。
3、隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。
4、持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务已经正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成。否则的话就会造成我们虽然看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。这是不允许的。
三、mysql隔离级别
READ UNCOMMITTED(未提交读)
在未提交读这个事务级别中,一个事务可以读取到另外一个事务未提交的数据.
例如 A 事务更新了一个字段,但是未提交在 B 事务中,读取id为1000的记录的name字段的时候,name的值为'aaa',可是 A 事务并没有commit,所以name = 'aaa'有可能是会被回滚的,那么,A 事务读取了未提交事务的数据称为脏读(Dirty Read)
READ COMMITTED(提交读)
提交读这个事务级别中,一个事务可以读取到另外一个事务提交之后的数据.
例如 A 事务读取到了id为1000的记录的name字段为aaa ,然后 B 事务这个时候更新了这条记录的name值,并且提交了,这个时候 A 事务再次读取name的话,name的值就是bbb了,所以在一个事务中,对一个字段进行多次读取,可能得到的值不同.
A事务前后两次读取的值不一致!
REPEATABLE READ(可重复读)
可重复读这个事务级别中,一个事务重复去读的字段不会改变.
例如 A 事务读取到了id为1000的记录的name值为aaa,然后 B 事务中把name改成了bbb,并且 B 事务提交了,A 事务再次去读name的时候并不会读取到bbb,所以 A 事务相当于在一个独立的世界,外界的任何改动不会影响 A 事务.
但是,可重复读会导致幻读出现,什么是幻读呢,举个例子:
A 事务查询一个表,表里只有一条记录,id为1,但是这个时候 B 事务插入了一条数据,id为2,A 事务因为不知道有id为2的数据,所以这个时候A也插入了一条id为2的数据,这个时候肯定会插入失败.这种情况就是幻读
备注: MYSQL中的innoDB通过MVCC(多版本并发控制)解决了幻读,另外MYSQL的默认事务级别就是可重复读,Oracle和SQL Server 默认隔离级别为 已提交读(Read committed)
SERIALIZABLE(可串行化)
可串行化事务级别,把读取的每一行数据都加了锁
加锁了的有点就是,避免了脏读和幻读,另外还避免了不可重复读的可能性,但是因为加锁了,减少了很大的并发性,因为同一时刻,只有一个线程能够获取到锁.还可能导致大量超时问题.
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
隔离级别:
隔离级别 | 脏读(Dirty Read) | 不可重复读(NonRepeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
未提交读(Read uncommitted) | 可能 | 可能 | 可能 |
已提交读(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
可串行化(Serializable ) | 不可能 | 不可能 | 不可能 |
级别越高,数据越安全,但性能越低。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://www.cnblogs.com/123-shen/p/11267655.html
- mysql修改初始密码教程(使用MySQL命令行修改密码)
- mysql 查询语句group by用法(MySQL group by和order by如何一起使用)
- mysql insert into 怎么用(MySQL中INSERT的一般用法)
- mysql创建数据库基本指令(MySql 新建用户与数据库的实际操作步骤)
- oracle和mysql查询所有表(Oracle、MySQL和SqlServe三种数据库分页查询语句的区别介绍)
- mysql完全快速清空一个表(浅谈MySQL如何优雅的做大表删除)
- mysql连接navicat报错1045(Navicat 连接MySQL8.0.11出现2059错误)
- mysql字段多有什么问题(MySQL编码不一致可能引起的一些问题)
- mysql8.0.12安装教程图解(MySql8.023安装过程图文详解首次安装)
- mysql事务特性的主要作用(详解MySQL中事务的持久性实现原理)
- 查询按照部门分组的mysql语句(Mysql根据某层部门ID查询所有下级多层子部门的示例)
- win10下安装mysql8.0.23 及 “服务没有响应控制功能”问题解决办法(win10下安装mysql8.0.23 及 “服务没有响应控制功能”问题解决办法)
- mysql常见错误提示及解决办法(MYSQL 无法识别中文的永久解决方法)
- mysql三种查询方式(MySQL查询学习之基础查询操作)
- mysql 5.5.27 winx64安装配置方法图文教程(mysql 5.5.27 winx64安装配置方法图文教程)
- mysql5.7.19下载及安装教程(Apache2.2.16+PHP5.3.3+MySQL5.1.49的配置方法)
- 法国面包(法国面包法棍)
- 微信(微信分身)
- 双十二(双十二和双十一哪个划算)
- 佛肚竹盆景的养护之道(佛肚竹盆景的养护之道)
- 包水饺(包水饺手法怎么包视频)
- 越南河粉(越南河粉来自哪里)
热门推荐
- mysql全套优化(Mysql优化神器推荐)
- mysql中date_format日期格式化
- 阿里云ecs集群怎么设置(“阿里云ECS服务器”使用别家CDN防护怎么设置IP白名单?)
- VS调试时无法命中断点
- python数字图像处理入门(python图像处理入门一)
- opencv自带的人脸识别(Dlib+OpenCV深度学习人脸识别的方法示例)
- docker怎么使用supervisor(supervisor下的Dockerfile的多服务镜像封装操作)
- docker默认网桥设置(Docker默认网段修改实现方法解析)
- vue-router的安装(详解Vue-Router的安装与使用)
- python2.7连接sqlserver数据库(Python使用sqlalchemy模块连接数据库操作示例)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9