commit :手动提交事务

rollback :手动回滚结束事务

使用一个JDBC事务的基本步骤如下:

@Test public void testTX(){ String url = “jdbc:mysql://127.0.0.1:3306/test”; String username = “root”; String password = “1234”;

String sourceUserId = “leo”; String desUserId = “xnn”; int money = 500;

Connection connection = null; try { //1.加载数据库驱动程序 Class.forName(“com.mysql.jdbc.Driver”); //获得数据库连接 connection = DriverManager.getConnection(url, username, password); //开启事务 connection.setAutoCommit(false);//如果为true的话,sql语句会分别执行,修改数据库;如果为false的话,会激活事务

//多条数据操作数据 Statement sql = connection.createStatement(); sql.executeUpdate(“UPDATE user_info SET balance = balance-” + money + " WHERE user_id = ‘" + sourceUserId+"’“); sql.executeUpdate(“UPDATE user_info SET balance = balance+” + money + " WHERE user_id = '” + desUserId+“'”); //提交事务 connection.commit();

} catch (SQLException e) { e.printStackTrace(); try{ //回滚 connection.rollback(); }catch (SQLException ex){ }

} catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }

从代码中我们可以看出来JDBC事务的缺点:

1.冗长、重复 2.需要显示事务控制 3.需要显示处理受检查异常

并且JDBC仅仅是为了完成事务操作提供了基础的API支持,通过操作JDBC我们可以将多个sql语句放到同一个事务中,保证ACID特性,但是当遇到跨库跨表的sql,简单的JDBC事务就无法满足了,基于这种问题,JTA事务出现了

JTA事务

JTA(Java Transaction API)提供了跨数据库连接(或其他JTA资源)的事务管理能力。JTA事务管理则由JTA容器实现,J2ee框架中事务管理器与应用程序,资源管理器,以及应用服务器之间的事务通讯

JTA的构成

在JTA中有几个重要的概念:

1).高层应用事务界定接口,供事务客户界定事务边界

2).X/Open XA协议(资源之间的一种标准化的接口)的标准Java映射 ,它可以使事务性的资源管理器参与由外部事务管理器控制的事务中

3).高层事务管理器接口,允许应用程序为其管理的程序界定事务的边界范围

JTA中的重要接口

JTA中的重要接口主要位于javax.transaction包中

1).UserTransaction:让应用程序得以控制事务的开始、挂起、提交与回滚等操作,由java或者ejb组件调用

2).TransactionManager :用于应用服务管理事务的状态

3).Transaction:用于控制执行事务操作

4).XAResource :用于在分布式事务环境下,协调事务管理器和资源管理器的工作

5).XID:用来为事务标示的java映射id

需要注意的是前三个接口仅存在于 javaee.jar 中,在javaSe中并不存在。

JTA事务编程的基本步骤

我们来看下使用JTA事务的基本步骤,通过简单的java编码完成一个简单的JTA事务过程:

//配置JTA事务,建立对应的数据源 //1.建立事务:通过创建UserTransaction类的实例来开始一个事务 Context ctx = new InitialContext§ ; UserTransaction trans = (UserTransaction) ctx.lookup(“javax. Transaction.UserTransaction”); //开始事务 trans.begin(); //找到数据源,进行绑定 DataSource ds = (DataSource) ctx.lookup(“mysqldb”); //建立数据库连接 Connection mycon = ds.getConnection(); //执行了sql操作 stmt.executeUpdate(sqlS); //提交事务 trans.commit(); //关闭连接 mycon.close();

JTA事务的优缺点

可以看出,JTA的优点很明显,提供了分布式下的事务解决方案,并且执行严格的ACID操作,但是,标准的JTA事务在日常开发中并不常用,其原因就是JTA的缺点导致的,例如JTA的实现相当复杂,JTA UserTransaction需要从JNDI获取,即我们如果要实现JTA一般情况下也需要实现JNDI,并且JTA只是个简易的容器,使用复杂,在灵活的需求下很难实现代码复用,因此我们需要一个能给我们进行完善容器事务操作的框架

Spring事务与事务抽象

Spring给我们封装了一套事务机制,并且提供了完善的事务抽象,将事务所需要的步骤进行抽象划分,并以编程的方式提供一个标准API,如下:

try{

//1.开启事务 //2.执行数据库操作

//3.提交事务

}catch(Exception ex){

//处理异常 //4.回滚事务

}finally{

//关闭连接,资源清理 }

Spring的事务抽象

Spring的抽象事务模型基于接口PlatformTransactionManager ,该接口有不同的多种实现,每一种实现都有对应的一个特定的数据访问技术,大体如下:

可以看到,Spring并不是提供了完整的事务操作Api,而是提供了多种事务管理器,将事务的职责托管给了Hibernate、JTA等持久化机制平台框架来实现,而仅仅提供一个通用的事务管理器接口–org.springframework.transaction.PlatformTransactionManager ,并且给各大持久化事务平台框架提供了对应的事务管理器,用来限制其通用行为,但是具体事务实现将由各大平台自己去实现:

Public interface PlatformTransactionManager{ // 由TransactionDefinition得到TransactionStatus对象 TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; // 提交 Void commit(TransactionStatus status) throws TransactionException; // 回滚 Void rollback(TransactionStatus status) throws TransactionException; }

在Spring中使用各个事务

接下来我们来看看,如果使用Spring事务抽象来使用各个事务平台,该如何使用:

Spring JDBC事务

如果应用程序中直接使用JDBC来进行持久化操作,可以使用DataSourceTransactionManager 来处理事务边界,而使用DataSourceTransactionManager ,你需要使用xml配置将其装配到应用上下文中:

而配置完毕以后,在JDBC实例中,DataSourceTransactionManager是通过调用java.sql.Connection来管理事务 ,在sql所在的方法执行完毕以后,将会自动调用连接的commit()方法来提交事务,同样的如果执行过程中出现了异常,将会触发调用rollback()方法进行回滚 。

Hibernate事务

如果应用程序的持久化是通过Hibernate来实现的,那么你需要使用HibernateTransactionManager ,对于Hibernate3及以上版本,需要在Spring上下文定义中添加如下的Bean声明:

Java持久化Api事务–JPA

事实上JPA规范的实现来自Hibernate,如果你打算使用JPA事务的话,你需要使用JpaTransactionManager 来管理事务,配置如下:

JpaTransactionManager 只需要装配一个JPA实体管理工厂(javax.persistence.EntityManagerFactory接口的任意实现),而JpaTransactionManager 将与由工厂所产生的JPA EntityManager 合作来构建事务

PlatformTransactionManager 及其相关属性

事务管理器接口PlatformTransactionManager 通过getTransaction 方法来得到事务,参数为TransactionDefinition 类,而这个类定义类事务的基本属性:

1.传播行为 2.隔离规则 3.回滚规则 4.事务超时设置 5.事务是否只读

而TransactionDefinition 接口的定义如下:

public interface TransactionDefinition { int getPropagationBehavior(); // 返回事务的传播行为 自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

Spring全套教学资料

Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。

目录:

部分内容:

Spring源码

第一部分 Spring 概述第二部分 核心思想第三部分 手写实现 IoC 和 AOP(自定义Spring框架)第四部分 Spring IOC 高级应用 基础特性 高级特性第五部分 Spring IOC源码深度剖析 设计优雅 设计模式 注意:原则、方法和技巧第六部分 Spring AOP 应用 声明事务控制第七部分 Spring AOP源码深度剖析 必要的笔记、必要的图、通俗易懂的语言化解知识难点

脚手框架:SpringBoot技术

它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。

Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。

SpringBoot入门配置文件日志Web开发DockerSpringBoot与数据访问启动配置原理自定义starter

微服务架构:Spring Cloud Alibaba

同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

微服务架构介绍Spring Cloud Alibaba介绍微服务环境搭建服务治理服务容错服务网关链路追踪ZipKin集成及数据持久化消息驱动短信服务Nacos Confifig—服务配置Seata—分布式事务Dubbo—rpc通信

Spring MVC

目录:

部分内容:

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取! QoY-1713343879698)]

[外链图片转存中…(img-6tMYkmSA-1713343879698)]

[外链图片转存中…(img-FEjOHkro-1713343879698)]

部分内容:

[外链图片转存中…(img-5JBxACkT-1713343879698)]

[外链图片转存中…(img-aN2vYdh1-1713343879699)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

推荐阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: 


大家都在找:

nginx:nginx是什么意思

spring:spring框架

运维:运维管理

大家都在看: