nginx视频教程吾爱破解,Spring事务与事务抽象
commit:手动提交事务rollback:手动回滚结束事务使用一个JDBC事务的基本步骤如下:@Testtry {//1.加载数据库驱动程序//获得数据库连接//开启事务//如果为true的话,sql语句会分别执行,修改数据库;
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开发
- Docker
- SpringBoot与数据访问
- 启动配置原理
- 自定义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)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
更多推荐
所有评论(0)