事务 Transcation 是什么?
事务,大家所熟悉的事务(Transcation),基本上会就往Spring事务靠。其实Spring事务管理基于底层数据库本身的事务处理机制。数据库事务的基础,是掌握Spring事务管理的基础。这篇总结下数据库事务。
一、数据库事务
它的思想:we are 伐木累。就是多个SQL语句(一个团队),要么所有执行success,不然就fail。
它最终的目标:数据不会被破坏。即事务操作成功,数据的结果和业务期待的结果是一致的。这也就是ACID中的一致性(Consistency)。那什么是ACID呢?
二、ACID
上面是思想,牛人马上根据思想建模,DBMS中数据库事务满足4各特性,即原子性、一致性、隔离性和持久性。下面一一生动解释:
a)原子性
原子是物质的最小单元,即不可再分。
例如,以MySQL为例,每一个简单的 SQL 语句即包含在一个事务中,具有原子性。这时候有人问了,那多个SQL呢?
1. BEGIN TRANSACTION;
2.
3. INSERT INTO `test`.`city` (`state`, `country`, `name`)
4. VALUES ('1', 'China', 'CHINA','错误语句多了个VALUE');
5.
6. INSERT INTO `test`.`city` (`state`, `country`, `name`)
7. VALUES ('1', 'China', 'CHINA');
8.
9. COMMIT;
结果:执行不通过。行3-4:为一个错误SQL。行6-7:是一个正确的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默认事务等级。但在安全性极高,几乎不会出现高并发情况下,选择更高的事务等级。根据上小节的图一幕了然。
事务 Transcation 是什么?相关推荐
- Hibernate事务增删改查(第一部分)
Hibernate的增删改查(事务) 1.Hibernate中的事物 1.1 设置事物隔离级别 Hibernate中书屋的隔离级别都是用字节存储的二进制 十进制 read uncommitted 读未 ...
- 深度讲解:web前端性能优化
一.课程简介: 1.课程大纲 涉及到的分类 网络层面 构建层面 浏览器渲染层面 服务端层面 涉及到的功能点 资源的合并与压缩 图片编解码原理和类型选择 浏览器渲染机制 懒加载预加载 浏览器存储 缓存机 ...
- Hibernate5.x Eclipse搭建
今天写一个简单的hibernate框架搭建流程 首先准备好我们的jar包,这里附上一个jar包链接 hibernate下载 下载完jar后新建一个简单的java工程,结构如下 项目结构 接下来编写我们 ...
- web前端性能优化总结
概括 涉及到的分类 网络层面 构建层面 浏览器渲染层面 服务端层面 涉及到的功能点 资源的合并与压缩 图片编解码原理和类型选择 浏览器渲染机制 懒加载预加载 浏览器存储 缓存机制 PWA Vue-SS ...
- web项目导入变java项目_eclipse导入web项目变成java项目解决办法
python新技能get--看!源!码! 上节课一起看了一下ThreadingTCPserver和tornado的源码,真是心力交瘁...后来仔细的想了一下,看懂源码其实并不难,只是需要明确一些以前我 ...
- 如果多个用户同时修改同一客户记录,而且先后提交修改,Oracle 怎样保证该客户记录...
如果多个用户同时修改同一客户记录,而且先后提交修改,Oracle 怎样保证该客户记录 首先你要了解什么叫做 "事务 transcation " :一个事务包含一个或多个DML语 ...
- SQLite的事务处理
原文转载:SQLite事务(Transcation)/BUNOOB.COM 概述:SQLite事务(Transaction) 事务是一个对数据库执行工作单元,是以逻辑顺序完成的工作单位或序列,可以由用 ...
- Redis,永远嘀神!
前言 前段时间在复习来着,过程中发现许多知识在脑子中很零散.并不是不知道,也或者曾经在某个地方看到过,突然想不起来,再次看到时又能记个大概.总结下来就是知识不成体系,总是东一块西一块,没有把他们串起来 ...
- 在C#中使用COM+实现事务控制
.NET技术是微软大力推广的下一代平台技术,自从.NET技术架构的正式发布,此项技术也逐渐走向成熟和稳定.按照微软的平台系统占有率,我们不难想象得到,在未来的一两年内.NET技术必定会势如破竹一般的登 ...
最新文章
- Leetcode 141. Linked List CycleJAVA语言
- 什么是量子计算-超级简单的给你个解释
- Zookeeper基于Java访问-节点事件监听
- ISAPI_Rewrite 规则说明
- 某测试仪控制系统的设计方案--ARM+FPGA+NIOS
- Nginx windows安装部署
- electron-vu打造低配版网易云(Mv版)
- Android 8.0 Oreo 来啦!
- CSS3 鲜为人知的属性-webkit-tap-highlight-color的理解
- Scikit-Learn (浅谈PCA降维算法)
- 三星固态硬盘 SM951 NVME win7介绍与安装方法
- 软件工程需求分析-需求规格说明书
- 火车头采集的文件发布到服务器上,火车头采集器图片采集上传设置
- 易中天品汉代风云人物06:韩信身世之谜
- iPhone6和iPhone6Plus的适配
- 深圳监控安装上门服务简介
- 计算机网络应用层和传输层及网络层协议有哪些?
- android vivo 模拟器,逍遥安卓打造VIVO华为魅族OPPO小米联想手游安卓模拟器
- JAVA 学习日志 测试抽象类的程序,每天进步/退步一点点,变化很大哦,努力!
- PIX for Windows使用