java中事务并发问题是_事务必会必知
作者:泥瓦匠 原文链接:传送门
事务,大家所熟悉的事务(Transaction),基本上会就往Spring事务靠。其实Spring事务管理基于底层数据库本身的事务处理机制。数据库事务的基础,是掌握Spring事务管理的基础。这篇总结下数据库事务。
一、数据库事务
它的思想:we are 伐木累。就是多个SQL语句(一个团队),要么所有执行success,不然就fail。 它最终的目标:数据不会被破坏。即事务操作成功,数据的结果和业务期待的结果是一致的。这也就是ACID中的一致性(Consistency)。那什么是ACID呢?
二、ACID
上面是思想,牛人马上根据思想建模,DBMS中数据库事务满足4各特性,即原子性、一致性、隔离性和持久性。下面一一生动解释: a)原子性 原子是物质的最小单元,即不可再分。 例如,以MySQL为例,每一个简单的 SQL 语句即包含在一个事务中,具有原子性。这时候有人问了,那多个SQL呢?
BEGIN TRANSACTION;
INSERT INTO `test`.`city` (`state`, `country`, `name`)
VALUES
('1', 'China', 'CHINA','错误语句多了个VALUE');
INSERT INTO `test`.`city` (`state`, `country`, `name`)
VALUES
('1', 'China', 'CHINA');
COMMIT;
结果:执行不通过。行3-5:为一个错误SQL。行6-8:是一个正确的SQL。它们各自被包裹在各自的隐式事务中,即Read Uncommited。T-all包裹了上面具有原子性的T-1和T-2,实现了更大的原子,如下图。 b)一致性 终极目标:数据不会被破坏。(这不是废话?确实有点)具体说,事务操作成功后,数据库所处的状态和它的业务规则是一致的,即数据不会被破坏。举个栗子:两句UPDATE语句,从A账户转账到B账户,不管成功失败,A和B账户的总额是不变的。 c)隔离性 隔离:表示互不干扰。事务与事务之间无法干扰,即每个事务独立,不会交叉。这样可以让多个线程并发访问数据库。如图:
但是聪明的小伙伴知道,如果事务完全隔离,每次只允许一个事务能访问数据库,那其他都是阻塞。会非常慢。 但是聪明的小伙伴也知道,这样会造成数据的并发问题。(是的,在下面第三节讲)。 d)持久性 数据必须持久化到数据库(存储在磁盘)中。已提交的事务,即使在提交后数据库崩溃,重启数据库时也能够根据日志对未持久化的数据进行重执行操作。(同学会问,那没提交的事务呢?那就悲剧了(>﹏<)) 小结:数据的一致性是最终目标,其他特性都是其要求或手段。
三、隔离性中的问题:脏读、不可重复读和幻读
对应上面的隔离性,事务并发访问的时候会出现:脏读、不可重复读和幻读。案例转自勇哥博客 脏读:A事务读取了B事务未提交的更改数据。一般数据库事务默认不允许该问题出现。 比如这里查询应该是1500,现在出现了脏读。
时间
事务 A(存款)
事务 B(取款)
T1
开始事务
T2
开始事务
T3
查询余额(1000 元)
T4
取出 1000 元(余额 0 元)
T5
查询余额(0 元)
T6
撤销事务(余额恢复为 1000 元)
T7
存入 500 元(余额 500 元)
T8
提交事务
不可重复读:A事务读取了B事务已提交的更改数据。 幻读:A事务读取了B事务提交的新增数据。 上面的案例脑补吧,主要还是看下面。 不可重复读和幻读区别:一个更改,一个新增数据。其实两个区别在于一个是新增(insert语句),处理幻读这个操作需要加表级别的锁,将整个表锁定,防止新增数据造成幻读。另一个则是更改(update delete),这时候避免这个情况只需要添加行级锁组织该行发生变化即可。
四、事务隔离级别
既要求高的隔离性(安全性),又要求高并发性。这种是不可能的任务。根据各种锁的操作机制出现了一个事务隔离级别。即相同情况下的输入,不同隔离级别结果不同。为啥了,当然是在并发性和安全性的抉择。如图: 按着图说的,根据程序的并发性和安全性的抉择。鱼和熊掌不可兼得也~ 但分布式的时候,可以吧安全性关键的单独分布式锁。 好了,案例说了很多下面代码实战。 ps: 休息下,泥瓦匠的代码都会这github上~ ,这段代码地址:https://github.com/JeffLi1993/jee-component-learning
五 、JDBC事务实战
下面利用MYSQL JDBC驱动连接MySQL,代码如下:
public class TransactionLevels extends BaseJDBC {
public static void main(String[] args) {
try {
// 加载数据库驱动
Class.forName(DRIVER);
// 数据库连接
Connection conn = DriverManager.getConnection(URL,USER,PWD);
// 数据库元数据
DatabaseMetaData metaData = conn.getMetaData();
// 是否支持事务
boolean isSupport = metaData.supportsTransactions();
System.out.println(isSupport);
// 是否支持的事务
boolean isSupportLevel = metaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE);
System.out.println(isSupportLevel);
// 获取默认事务
int defaultIsolation = metaData.getDefaultTransactionIsolation();
System.out.println(defaultIsolation);
/** 关闭数据库连接 */
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
第 5、7行是连接数据库 第 9 行:获取数据库元数据,这是包含数据库连接信息 第 12 行:从元数据中,判断是否支持事务 第 15 行:从元数据中,判断是否支持事务级别 TRANSACTION_SERIALIZABLE 第 18 行:这里可以看出MySQL默认支持的事务级别是 READ_COMMITTED,默认会隔离脏读。 具体源码如下: 因此在安全性要求不高,支持高并发的情况下,选择MySQL默认事务等级。但在安全性极高,几乎不会出现高并发情况下,选择更高的事务等级。根据上小节的图一幕了然。
六、补充
关于事务,还有大家熟悉的Spring事务管理、具体数据库事务的实现,推荐一本书《MySQL技术内幕InnoDB存储引擎 》。 下一篇:ThreadLocal的工作机制,揭示Spring事务同步管理器的工作原理 如以上文章或链接对你有帮助的话,别忘了分享到朋友圈,让更多的人阅读这篇文章。
java中事务并发问题是_事务必会必知相关推荐
- 图解 深入浅出JavaWeb:事务必会必知
事务,大家所熟悉的事务(Transcation),基本上会就往Spring事务靠.其实Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring事务管理的基础.这篇总结 ...
- Java中有关Null的9件事
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...
- 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)
文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...
- 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)
文章目录 <Java并发编程的艺术>读后笔记-Java中的并发工具类(第八章) 1.等待多线程完成的CountDownLatch 2.同步屏障CyclicBarrier 2.1 Cycli ...
- java初学者指南_企业Java中事务隔离级别的初学者指南
java初学者指南 介绍 基于ACID事务属性的关系数据库强一致性模型. 在本文中,我们将阐明对资源本地事务和JTA事务使用不同的事务隔离级别和各种配置模式的背后原因. 隔离和一致性 在关系数据库系统 ...
- 企业Java中事务隔离级别的初学者指南
介绍 基于ACID事务属性的关系数据库强一致性模型. 在本文中,我们将阐明对资源本地事务和JTA事务使用不同的事务隔离级别和各种配置模式的背后原因. 隔离和一致性 在关系数据库系统中,原子性和持久性是 ...
- java中include标签的用法_原 ng-include用法分析以及多标签页面的简单实现方式
在平时的项目开发中,应该会经常遇到上图所示的需求,就是在一个页面中有多个标签,被选中的标签颜色会高亮显示,切换不同标签显示相应的不同内容.如果内容代码过多则写在同一个html文件就会显得特别乱,所以这 ...
- Java中事务的传播机制和隔离级别
一.传播机制 Spring事务的传播机制是指在方法调用链中,对于已经开启的事务以及后续子方法如何处理事务.Spring框架提供了7种传播行为来控制事务的传播过程,分别为: PROPAGATION_RE ...
- java中事务的介绍
2019独角兽企业重金招聘Python工程师标准>>> java的事务处理,如果对数据库进行多次操作,每一次的执行或步骤都是一个事务.如果数据库操作在某 一步没有执行或出现异常而导致 ...
最新文章
- 深度学习:梯度下降算法改进
- 经典爬虫:用Scrapy爬取百度股票
- 专访英特尔戴金权 | AI和大数据正在这样重塑英特尔
- idea使用leecode插件
- P1198 [JSOI2008]最大数
- 04_Nginx命令行参数,控制信号,Nginx启动、停止、重启命令
- django 开发中数据库可以怎样优化
- error occurred when trying to upload ui5 project to ABAP repository in win8
- Swoole入门指南:PHP7安装Swoole详细教程(一)
- javafx 遮罩_JavaFX技巧31:遮罩/剪切/ Alpha通道
- ExtJs 入门 [窗体:Window组件]
- 多线程-ReentrantLock
- 给服务器传文件的工具,向服务器传文件的工具
- 蓝桥杯 Java B组省赛真题【2017】
- 医号馆诊所管理软件系统更新,新增人脸识别、处置单等功能!
- 两种典型的解空间树:子集树和排列树
- Flink Forward Asia Hackathon (2021) 回顾
- AddressBook iOS读取通讯录信息
- Mac 安装 双系统 体验极差的好几天
- 弘辽科技:拼多多懵懂商家不知道的直通车操作
热门文章
- 湎计算机网络通讯设备有哪些,2018年4月自考计算机网络原理04741试题及答案
- wps在word文档中插入xlsx格式文档会自动打开
- thingsboard往kafka推送数据
- Oracle loap函数,oracle loap函数用法
- linux展示表空间大小,oracle中看表空间大小等
- 2020数学建模国赛(B)穿越沙漠
- 陌陌发布新版 增加阅后即焚和短视频功能
- 【uniapp】小程序云开发更新、删除云数据库数据
- 深度学习Ubuntu20.04+CUDA+Pytorch环境配置+无显示器远程控制(1)
- 黑马头条登录到个人中心页面