mysql jdbc 事务隔离级别_JDBC事务隔离级别,看完这篇文章就够了!
作者:DencyCheng
来源:CSDN
1. 事务基本概念
一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元。
事务开始点
连接到数据库上,并执行一条DML语句insert、update或delete
前一个事务结束后,又输入了另一条DML语句
事务结束点
执行commit或rollback语句。
执行一条DDL语句,例如create table语句,在这种情况下,会自动执行commit语句。
执行一条DDL语句,例如grant语句,在这种情况下,会自动执行commit。
断开与数据库的连接
执行了一条DML语句,该语句却失败了,在这种情况中,会为这个无效的DML语句执行rollback语句。
2. 事务的四大特点(ACID)
actomicity(原子性)
表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败
consistency(一致性)
表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态
isolation(隔离性)
事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
durability(持久性)
持久性事务完成之后,它对于系统的影响是永久性的。
3. 事务隔离级别
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。
例如:
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:
4. 案例演示事务隔离级别
环境准备
下面,将利用MySQL的客户端程序,分别测试几种隔离级别。测试数据库为test,表为tx;表结构如下:
两个命令行客户端分别为A,B;不断改变A的隔离级别,在B端修改数据。
read uncommitted(未提交读)
将A的隔离级别设置为read uncommitted(未提交读)
在B未更新数据之前:
客户端A:
B更新数据:
客户端B:
客户端A:
经过上面的实验可以得出结论,事务B更新了一条记录,但是没有提交,此时事务A可以查询出未提交记录。造成脏读现象。read uncommitted(未提交读)是最低的隔离级别。
read committed(已提交读)
将客户端A的事务隔离级别设置为read committed(已提交读)
在B未更新数据之前:
客户端A:
B更新数据:
客户端B:
客户端A:
经过上面的实验可以得出结论,已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的数据不一致,因为在两次查询之间事务B更新了一条数据。已提交读只允许读取已提交的记录,但不要求可重复读。
repeatable read(可重复读)
将A的隔离级别设置为repeatable read(可重复读)
在B未更新数据之前:
客户端A:
B更新数据:
客户端B:
客户端A:
B插入数据:
客户端B:
客户端A:
由以上的实验可以得出结论,可重复读隔离级别只允许读取已提交记录,而且在一个事务两次读取一个记录期间,其他事务部的更新该记录。但该事务不要求与其他事务可串行化。例如,当一个事务可以找到由一个已提交事务更新的记录,但是可能产生幻读问题(注意是可能,因为数据库对隔离级别的实现有所差别)。像以上的实验,就没有出现数据幻读的问题。
Serializable(可串行化)
将A的隔离级别设置为Serializable (可串行化)
A端打开事务,B端插入一条记录
事务A端:
事务B端:
因为此时事务A的隔离级别设置为serializable,开始事务后,并没有提交,所以事务B只能等待。
事务A提交事务:
事务A端:
事务B端:
注意:serializable是完全锁定字段的,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止 。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题。
欢迎关注我的公众号::一点教程。获得独家整理的学习资源和日常干货推送。
如果您对我的系列教程感兴趣,也可以关注我的网站:yiidian.com
mysql jdbc 事务隔离级别_JDBC事务隔离级别,看完这篇文章就够了!相关推荐
- 看完这篇文章,让你彻底理解事务隔离级别(读未提交、读已提交、可重复读、序列化)
对于不同的事务,采用不同的隔离级别分别有不同的现象.主要有下面3种: 1.脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据. 2.不可重复读(nonrepeatable re ...
- MySQL事务,这篇文章就够了
原文链接:https://blog.ouyangsihai.cn/ >> MySQL事务,这篇文章就够了 在看这篇文章之前,我们回顾一下前面的几篇关于MySQL的系列文章,应该对你读下面的 ...
- 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了)
title: 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了) tags: 面试常见题 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈 ...
- mysql事务所_MySQL事务,这篇文章就够了
0 什么是事务 事务(Transaction) 是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都 执行,要么都不执行,它是一个不可分割的工作单位.事务是数据库维护数据一致性的单位,在 ...
- mysql人像伴随模型_还不了解MySQL跨行事务模型吗?看完这篇你也就差不多了!...
导读 说来和MySQL倒是有缘,毕业的第一份工作就被分配到了RDS团队,主要负责把MySQL弄到云上做成数据库服务.虽说整天和MySQL打交道,但说实话那段时间并没有很深入的理解MySQL内核,做的事 ...
- mysql jdbc驱动 批量更新_jdbc批量插入,删除,更新
批量处理:一次向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能. 不确定JDBC驱动程序是否支持此功能.应该使用DatabaseMetaData.supportsBatchUpdates( ...
- Spring 事务失效?看这篇文章就够了!
欢迎关注方志朋的博客,回复"666"获面试宝典 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 不知道小伙伴们有没有这样的经历,在自己开心的编 ...
- 《Spring事务传播行为详解》经典例子 看完这篇,别的不用看了
前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为.事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.这是Spring ...
- wav文件头字节数和文件实际字节不一致_18道MySQL经典面试题及答案,8分钟看完,你会有不一样的收获...
1.MySQL的复制原理以及流程 (1).复制基本原理流程 1. 主:binlog线程--记录下所有改变了数据库数据的语句,放进master上的binlog中: 2. 从:io线程--在使用start ...
最新文章
- 使用Aspose.Cell控件实现Excel高难度报表的生成(三)
- 期末数据结构复习稳过不挂指南(更新中)
- iOS 项目经验以及APP上架流程 _Dylan
- ORACLE expdp/impdp详解
- 第二部分:志愿录取标准
- Zipkin-1.19.0学习系列1:java范例
- mysql搜索标题及时间_mysql搜索标题,描述和多行标记
- C语言-输入十进制数转换为二进制数
- RSA签名验签学习笔记
- 制作简单启动型 U 盘_附制作工具下载
- 内网穿透工具的原理与开发实战
- PxCook安装文件有问题处理办法
- (SQI)Face Recognition under Varying Lighting Conditions Using Self Quotient Image
- 职业学校计算机和机电哪个好,职业学校都有什么专业10大热门专业
- 「hdu6638」Snowy Smile【稀疏矩阵最大子矩阵和】
- 混合颜色带的应用(一)
- 重返母校怀抱,老同学聚会南京大学
- 什么是网络变压器共模抑制比?120dB与60dB的共模抑制比区别大吗?
- 审计需要掌握的计算机语言,审计人员应该具备的素质
- 华为手机安卓8.0以上的谷歌商店找不到的问题