事务,大家所熟悉的事务(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 是什么?相关推荐

  1. Hibernate事务增删改查(第一部分)

    Hibernate的增删改查(事务) 1.Hibernate中的事物 1.1 设置事物隔离级别 Hibernate中书屋的隔离级别都是用字节存储的二进制 十进制 read uncommitted 读未 ...

  2. 深度讲解:web前端性能优化

    一.课程简介: 1.课程大纲 涉及到的分类 网络层面 构建层面 浏览器渲染层面 服务端层面 涉及到的功能点 资源的合并与压缩 图片编解码原理和类型选择 浏览器渲染机制 懒加载预加载 浏览器存储 缓存机 ...

  3. Hibernate5.x Eclipse搭建

    今天写一个简单的hibernate框架搭建流程 首先准备好我们的jar包,这里附上一个jar包链接 hibernate下载 下载完jar后新建一个简单的java工程,结构如下 项目结构 接下来编写我们 ...

  4. web前端性能优化总结

    概括 涉及到的分类 网络层面 构建层面 浏览器渲染层面 服务端层面 涉及到的功能点 资源的合并与压缩 图片编解码原理和类型选择 浏览器渲染机制 懒加载预加载 浏览器存储 缓存机制 PWA Vue-SS ...

  5. web项目导入变java项目_eclipse导入web项目变成java项目解决办法

    python新技能get--看!源!码! 上节课一起看了一下ThreadingTCPserver和tornado的源码,真是心力交瘁...后来仔细的想了一下,看懂源码其实并不难,只是需要明确一些以前我 ...

  6. 如果多个用户同时修改同一客户记录,而且先后提交修改,Oracle 怎样保证该客户记录...

    如果多个用户同时修改同一客户记录,而且先后提交修改,Oracle 怎样保证该客户记录   首先你要了解什么叫做 "事务 transcation " :一个事务包含一个或多个DML语 ...

  7. SQLite的事务处理

    原文转载:SQLite事务(Transcation)/BUNOOB.COM 概述:SQLite事务(Transaction) 事务是一个对数据库执行工作单元,是以逻辑顺序完成的工作单位或序列,可以由用 ...

  8. Redis,永远嘀神!

    前言 前段时间在复习来着,过程中发现许多知识在脑子中很零散.并不是不知道,也或者曾经在某个地方看到过,突然想不起来,再次看到时又能记个大概.总结下来就是知识不成体系,总是东一块西一块,没有把他们串起来 ...

  9. 在C#中使用COM+实现事务控制

    .NET技术是微软大力推广的下一代平台技术,自从.NET技术架构的正式发布,此项技术也逐渐走向成熟和稳定.按照微软的平台系统占有率,我们不难想象得到,在未来的一两年内.NET技术必定会势如破竹一般的登 ...

最新文章

  1. Leetcode 141. Linked List CycleJAVA语言
  2. 什么是量子计算-超级简单的给你个解释
  3. Zookeeper基于Java访问-节点事件监听
  4. ISAPI_Rewrite 规则说明
  5. 某测试仪控制系统的设计方案--ARM+FPGA+NIOS
  6. Nginx windows安装部署
  7. electron-vu打造低配版网易云(Mv版)
  8. Android 8.0 Oreo 来啦!
  9. CSS3 鲜为人知的属性-webkit-tap-highlight-color的理解
  10. Scikit-Learn (浅谈PCA降维算法)
  11. 三星固态硬盘 SM951 NVME win7介绍与安装方法
  12. 软件工程需求分析-需求规格说明书
  13. 火车头采集的文件发布到服务器上,火车头采集器图片采集上传设置
  14. 易中天品汉代风云人物06:韩信身世之谜
  15. iPhone6和iPhone6Plus的适配
  16. 深圳监控安装上门服务简介
  17. 计算机网络应用层和传输层及网络层协议有哪些?
  18. android vivo 模拟器,逍遥安卓打造VIVO华为魅族OPPO小米联想手游安卓模拟器
  19. JAVA 学习日志 测试抽象类的程序,每天进步/退步一点点,变化很大哦,努力!
  20. PIX for Windows使用

热门文章

  1. 微博爬虫之:无需账号获取微博weibo的Cookie
  2. springboot启动 lombok 找不到符号
  3. 二维彩虹产品功能更新(H5编辑二维码)
  4. 驱动——LED灯循环闪烁
  5. 服务器虚拟机控制台打不开,OpenStack虚拟机控制台打不开
  6. 操作系统:文件系统——空闲块成组链接法的模拟
  7. ENFI下载器:1元20G高速下载流量,首次使用送3G
  8. LC1514. 概率最大的路径
  9. 微信小程序 申请第三方平台流程
  10. 企业员工全面激励训练整体解决方案 (节选)