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数据迁移相关总结)
- SQL SERVER与MySQL数据类型的对应关系
- mysql 查询语句group by用法(MySQL group by和order by如何一起使用)
- mysql数值类型图解(详解mysql持久化统计信息)
- mysqltruncate(MYSQL中Truncate的用法详解)
- docker怎么创建mysql服务(Docker部署MySQL8集群一主二从的实现步骤)
- linuxmysql客户端搭建(一台linux主机启动多个MySQL数据库的方法)
- 了解mysql数据自动备份(MySQL数据备份方法的选择与思考)
- mysql对null值如何理解(MySQL为Null会导致5个问题个个致命)
- mysql实现mvc(mysql的MVCC多版本并发控制的实现)
- mysql多表连接优化(浅谈Mysql多表连接查询的执行细节)
- python与mysql的联系(MySQL和Python交互的示例)
- mysql自定义函数怎么设置(MySQL自定义变量?学不废不收费~)
- mysql 日期和时间处理函数(MySQL日期与时间函数的使用汇总)
- docker部署mysql多实例(Docker部署mysql一主一从的操作方法)
- mysql缓存是什么(详解mysql查询缓存简单使用)
- 某知名企业绩效管理体系及薪酬分配体系操作手册(某知名企业绩效管理体系及薪酬分配体系操作手册)
- 职场人改不掉这4个习惯,只会越混越穷,一辈子也翻不了身(职场人改不掉这4个习惯)
- 华为 联想等46家公司笔试面试题,涉及各行各业,建议收藏(联想等46家公司笔试面试题)
- ()
- ()
- 800壮士拼死拖住30万日军 八佰 的真实历史,誓与阵地共存亡(800壮士拼死拖住30万日军)
热门推荐
- js实现图片旋转
- 单元格内容过多超出怎么办(单元格内文本显示超过单元格宽度的快速解决办法)
- 怎么把数据库备份到阿里(阿里云数据库备份DBS与自建备份系统有什么优势?)
- 利用前端做扫雷游戏(js实现经典扫雷游戏)
- sqlserver复制表结构及数据到新表(SQL SERVER 表与表之间 字段一对多sql语句写法)
- laravel开发登录接口(解决laravel5中auth用户登录其他页面获取不到登录信息的问题)
- canvas设置点击(Canvas高级路径操作之拖拽对象的实现)
- sql提交事务代码(SQL SERVER提交事务回滚机制)
- visual studio怎么连接数据库(使用Visual Studio Code连接MySql数据库并进行查询)
- extjs accordion折叠布局
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9