JPA原理

作者: 架构师奶爸 | 来源:发表于2021-02-19 17:10 被阅读0次

事务

事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性
( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。

本地事务

紧密依赖于底层资源管理器(例如数据库连接 ),事务处理局限在当前事务资源内。此种事务处理
方式不存在对应用服务器的依赖,因而部署灵活却无法支持多数据源的分布式事务。在数据库连
接中使用本地事务示例如下:

public void transferAccount()
{
    Connection conn = null;
    Statement stmt = null;
    try
    {
        conn = getDataSource().getConnection();
        conn.setAutoCommit(false);
        stmt = conn.createStatement();
        stmt.execute("update t_account set amount = amount - 500 where account_id = 'A'");
        stmt.execute("update t_account set amount = amount + 500 where account_id = 'B'");
        conn.commit();
    }
    catch(SQLException sqle)
    {
        conn.rollback();
        stmt.close();
        conn.close();
    }
}

分布式事务

Java 事务编程接口(JTA:Java Transaction API)和 Java 事务服务 (JTS;Java Transaction
Service) 为 J2EE 平台提供了分布式事务服务。分布式事务(Distributed Transaction)包括事务
管理器( Transaction Manager )和一个或多个支持 XA 协议的资源管理器 ( Resource
Manager )。我们可以将资源管理器看做任意类型的持久化数据存储;事务管理器承担着所有事务
参与单元的协调与控制。

public void transferAccount()
{
    UserTransaction userTx = null;
    Connection connA = null;
    Statement stmtA = null;
    Connection connB = null;
    Statement stmtB = null;
    try
    {
        // 获得 Transaction 管理对象
        userTx = (UserTransaction) getContext().lookup("java:comp/UserTransaction");
        connA = getDataSourceA().getConnection(); // 从数据库 A 中取得数据库连接
        connB = getDataSourceB().getConnection(); // 从数据库 B 中取得数据库连接
        userTx.begin(); // 启动事务
        stmtA = connA.createStatement(); // 将 A 账户中的金额减少 500
        stmtA.execute("update t_account set amount = amount - 500 where account_id = 'A'");
        // 将 B 账户中的金额增加 500
        stmtB = connB.createStatement();
        stmtB.execute("update t_account set amount = amount + 500 where account_id = 'B'");
        userTx.commit(); // 提交事务
        // 事务提交:转账的两步操作同时成功(数据库 A 和数据库 B 中的数据被同时更新)
    }
    catch(SQLException sqle)
    {
        // 发生异常,回滚在本事务中的操纵
        userTx.rollback(); // 事务回滚:数据库 A 和数据库 B 中的数据更新被同时撤销
    }
    catch(Exception ne)
    {}
}

两阶段提交

两阶段提交主要保证了分布式事务的原子性:即所有结点要么全做要么全不做,所谓的两个阶段
是指:第一阶段:准备阶段;第二阶段:提交阶段。


image.png

1、准备阶段
事务协调者(事务管理器)给每个参与者(资源管理器)发送Prepare 消息,每个参与者要么直接返回
失败(如权限验证失败),要么在本地执行事务,写本地的redo 和undo 日志,但不提交,到达一
种“万事俱备,只欠东风”的状态。
2、提交阶段
如果协调者收到了参与者的失败消息或者超时,直接给每个参与者发送回滚(Rollback)消息;否则,
发送提交(Commit)消息;参与者根据协调者的指令执行提交或者回滚操作,释放所有事务处理过
程中使用的锁资源。(注意:必须在最后阶段释放锁资源)
将提交分成两阶段进行的目的很明确,就是尽可能晚地提交事务,让事务在提交前尽可能地完成
所有能完成的工作。

相关文章

  • Spring Data JPA 实现原理

    Spring Data JPA 实现原理 在使用Spring Data JPA的时候,只需使用简单的接口定义,通过...

  • JPA原理

    事务 事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性( Con...

  • Spring Data JPA知识 day04

    一、Spring Data JPA的内部原理剖析 1.1Spring Data JPA的常用接口分析 在客户的...

  • spring data jpa 工作流程及原理

    最近帮同事看jpa的查询问题,抽空整理了一下相关知识,本篇先介绍jpa的工作流程(原理),后续再写关于实战以及开发...

  • jpa 代理Repository原理

    刚接触jpa的时候,我就被他惊艳了,心想 还写什么sql啊!!”、“还用什么mybatis啊”、”还建什么表啊! ...

  • 初学者对spring data框架的简单了解

    what? spring Data JPA 是spring 系列下的一个持久层框架,原理有些相似与hibernat...

  • Spring Boot & Spring Data &a

    :) 本篇会分别介绍 Spring Data ,JPA ,Spring Data JPA JPA简介 jpa全称是...

  • JPA工程搭建(入门篇)

    目录: 一、什么是JPA 二、JPA优势? 三、JPA简单工程搭建 一、JPA是什么? 用一句概括:JPA(JAV...

  • springboot jpa使用

    jpa系列:springboot jpa使用springboot jpa 关系注解和mappedByspringb...

  • springboot jpa自定义查询

    jpa系列:springboot jpa使用springboot jpa 关系注解和mappedByspringb...

网友评论

    本文标题:JPA原理

    本文链接:https://www.haomeiwen.com/subject/tbiaxltx.html