图解 & 深入浅出JavaWeb:事务必会必知

事务,大家所熟悉的事务(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.   
  5. VALUES 
  6.   
  7. ('1''China''CHINA','错误语句多了个VALUE'); 
  8.   
  9. INSERT INTO `test`.`city` (`state`, `country`, `name`) 
  10.   
  11. VALUES 
  12.   
  13. ('1''China''CHINA'); 
  14.   
  15. 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),这时候避免这个情况只需要添加行级锁组织该行发生变化即可。

四、事务隔离级别

既要求高的隔离性(安全性),又要求高并发性。这种是不可能的任务。根据各种锁的操作机制出现了一个事务隔离级别。即相同情况下的输入,不同隔离级别结果不同。为啥了,当然是在并发性和安全性的抉择。如图:

按着图说的,根据程序的并发性和安全性的抉择。鱼和熊掌不可兼得也~ 但分布式的时候,可以吧安全性关键的单独分布式锁。

好了,案例说了很多下面代码实战。

这段代码地址:https://github.com/JeffLi1993/jee-component-learning

五 、JDBC事务实战

下面利用MYSQL JDBC驱动连接MySQL,代码如下:

  1. public class TransactionLevels extends BaseJDBC { 
  2.     public static void main(String[] args) { 
  3.         try { 
  4.             // 加载数据库驱动 
  5.             Class.forName(DRIVER); 
  6.             // 数据库连接 
  7.             Connection conn = DriverManager.getConnection(URL,USER,PWD); 
  8.             // 数据库元数据 
  9.             DatabaseMetaData metaData = conn.getMetaData(); 
  10.   
  11.             // 是否支持事务 
  12.             boolean isSupport = metaData.supportsTransactions(); 
  13.             System.out.println(isSupport); 
  14.             // 是否支持的事务 
  15.             boolean isSupportLevel = metaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE); 
  16.             System.out.println(isSupportLevel); 
  17.             // 获取默认事务 
  18.             int defaultIsolation = metaData.getDefaultTransactionIsolation(); 
  19.             System.out.println(defaultIsolation); 
  20.   
  21.             /** 关闭数据库连接 */ 
  22.             if (conn != null) { 
  23.                 try { 
  24.                     conn.close(); 
  25.                 } catch (SQLException e) { 
  26.                     e.printStackTrace(); 
  27.                 } 
  28.             } 
  29.         } catch (Exception e) { 
  30.             e.printStackTrace(); 
  31.         } 
  32.   
  33.     } 

第 5、7行是连接数据库

第 9 行:获取数据库元数据,这是包含数据库连接信息

第 12 行:从元数据中,判断是否支持事务

第 15 行:从元数据中,判断是否支持事务级别 TRANSACTION_SERIALIZABLE

第 18 行:这里可以看出MySQL默认支持的事务级别是 READ_COMMITTED,默认会隔离脏读。

具体源码如下:

因此在安全性要求不高,支持高并发的情况下,选择MySQL默认事务等级。但在安全性极高,几乎不会出现高并发情况下,选择更高的事务等级。根据上小节的图一幕了然。

【本文为专栏作者“李强强”的原创稿件,转载请通过联系作者获取授权】 

戳这里,看该作者更多好文

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/229961.html<

(0)
运维的头像运维
上一篇2025-04-19 00:32
下一篇 2025-04-19 00:33

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注