作者: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事务隔离级别,看完这篇文章就够了!相关推荐

  1. 看完这篇文章,让你彻底理解事务隔离级别(读未提交、读已提交、可重复读、序列化)

    对于不同的事务,采用不同的隔离级别分别有不同的现象.主要有下面3种: 1.脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据. 2.不可重复读(nonrepeatable re ...

  2. MySQL事务,这篇文章就够了

    原文链接:https://blog.ouyangsihai.cn/ >> MySQL事务,这篇文章就够了 在看这篇文章之前,我们回顾一下前面的几篇关于MySQL的系列文章,应该对你读下面的 ...

  3. 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了)

    title: 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了) tags: 面试常见题 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈 ...

  4. mysql事务所_MySQL事务,这篇文章就够了

    0 什么是事务 事务(Transaction) 是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都 执行,要么都不执行,它是一个不可分割的工作单位.事务是数据库维护数据一致性的单位,在 ...

  5. mysql人像伴随模型_还不了解MySQL跨行事务模型吗?看完这篇你也就差不多了!...

    导读 说来和MySQL倒是有缘,毕业的第一份工作就被分配到了RDS团队,主要负责把MySQL弄到云上做成数据库服务.虽说整天和MySQL打交道,但说实话那段时间并没有很深入的理解MySQL内核,做的事 ...

  6. mysql jdbc驱动 批量更新_jdbc批量插入,删除,更新

    批量处理:一次向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能. 不确定JDBC驱动程序是否支持此功能.应该使用DatabaseMetaData.supportsBatchUpdates( ...

  7. Spring 事务失效?看这篇文章就够了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 不知道小伙伴们有没有这样的经历,在自己开心的编 ...

  8. 《Spring事务传播行为详解》经典例子 看完这篇,别的不用看了

    前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为.事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.这是Spring ...

  9. wav文件头字节数和文件实际字节不一致_18道MySQL经典面试题及答案,8分钟看完,你会有不一样的收获...

    1.MySQL的复制原理以及流程 (1).复制基本原理流程 1. 主:binlog线程--记录下所有改变了数据库数据的语句,放进master上的binlog中: 2. 从:io线程--在使用start ...

最新文章

  1. 使用Aspose.Cell控件实现Excel高难度报表的生成(三)
  2. 期末数据结构复习稳过不挂指南(更新中)
  3. iOS 项目经验以及APP上架流程 _Dylan
  4. ORACLE expdp/impdp详解
  5. 第二部分:志愿录取标准
  6. Zipkin-1.19.0学习系列1:java范例
  7. mysql搜索标题及时间_mysql搜索标题,描述和多行标记
  8. C语言-输入十进制数转换为二进制数
  9. RSA签名验签学习笔记
  10. 制作简单启动型 U 盘_附制作工具下载
  11. 内网穿透工具的原理与开发实战
  12. PxCook安装文件有问题处理办法
  13. (SQI)Face Recognition under Varying Lighting Conditions Using Self Quotient Image
  14. 职业学校计算机和机电哪个好,职业学校都有什么专业10大热门专业
  15. 「hdu6638」Snowy Smile【稀疏矩阵最大子矩阵和】
  16. 混合颜色带的应用(一)
  17. 重返母校怀抱,老同学聚会南京大学
  18. 什么是网络变压器共模抑制比?120dB与60dB的共模抑制比区别大吗?
  19. 审计需要掌握的计算机语言,审计人员应该具备的素质
  20. 华为手机安卓8.0以上的谷歌商店找不到的问题

热门文章

  1. 随笔之:VC操作Word系列(四)
  2. Linux 命令(52)—— ipcrm 命令
  3. Linux 命令(49)—— export 命令(builtin)
  4. Linux 命令(18)—— screen 命令
  5. C#GDI绘制渐变线条,可用于添加阴…
  6. 前后端分离 与 不分离
  7. liunx screen使用简单实验
  8. Shiro 整合SpringMVC 并实现权限管理,登录和注销
  9. 《C++ Primer》读书笔记—第六章 函数
  10. Xamarin Android 应用程序内图标上数字提示