使用Spring进行事物管理

CANoe的安装教程 阅读详情

1、编程式事物

所谓编程式事物指的是通过编码方式实现事物,即类似于JDBC编程实现事物管理

Spring对编程式事物的支持

Spring中的事物可以分为物理事物和逻辑事物;

        物理事物:就是底层数据库提供的事物支持,如JDBC或JTA提供的事物;

       逻辑事物:是Spring管理的事物,不同于物理事物,逻辑事物提供更丰富的控制而且如果想得到Spring事务管理的好处必须使用逻辑事务,因此在Spring中如果没特别强调        一般就是逻辑事务

Spring提供两种编程式事物支持:直接使用PlatformTransactionManager实现和使用TransactionTemplate模板类,用于支持逻辑事物管理。

1.1、直接使用PlatformTransactionTemplateManager进行编程式事物管理

PlatformTransactionTemplateManager实现,然后结合TransactionDefinition开启事物,并结合TransactionStatus来回滚或提交事物,就可以完成针对当前对象的整个事物管理

使用它的缺点也是很明显的,从应用程序开发的角度看,过于底层,不同事物管理API的造成的差异太大,异常处理会变得很麻烦,代码重复的数量将是惊人的。

下面是我使用PlatformTransactionTemplateManager来实现事物管理:

1、数据源和事物管理器定义的配置文件

         <!-- datasource for oracle -->
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource"
		destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
		<property name="username" value="scott"></property>
		<property name="password" value="123"></property>
	</bean>

	<!-- 事物管理器定义 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

2、测试时使用的SQL:

 public class springTransactionTest {
	/**
	 * 准备好测试使用的sql
	 */
	private static final String INSERT_SQL = "insert into td(user_name,password) values (?,?)";
	private static final String COUNT_SQL = "select count(*) from td";

3、初始化Spring容器:

/**
	 * 初始化spring容器
	 */
	private static ApplicationContext ctx;
	private static PlatformTransactionManager txManager;
	private static DataSource dataSource;
	private static JdbcTemplate jdbcTemplate;

	@BeforeClass
	public static void setUpClass() {
		ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
		txManager = (PlatformTransactionManager) ctx.getBean("transactionManager");
		dataSource = (DataSource) ctx.getBean("dataSource");
		jdbcTemplate = new JdbcTemplate(dataSource);
	}	

4、使用高级别JdbcTemplate来进行事务管理器测试

/**
	 * 使用高级别JdbcTemplate来进行事物管理器测试
	 */
	@Test
	public void testPlatformTransactionManager() {
		
		/**
		 * DefaultTransactionDefinition:事务定 义,定义如隔离级别、传播行为等,即在本示例中隔离级别为ISOLATION_READ_COMMITTED(提交读),
		 * 传播行为为 PROPAGATION_REQUIRED(必须有事务支持,即如果当前没有事务,就新建一个事务,如果已经存在一个事务中,就加入到这个事务中)。
		 * dbcTemplate:通过JdbcTemplate对象执行相应的SQL操作,且自动享受到事务支持,注意事务是线程绑定的,因此事务管理器可以运行在多线程环境;
		 * txManager.commit(status):提交status对象绑定的事务;
		 * txManager.rollback(status):当遇到异常时回滚status对象绑定的事务。
		 * TransactionStatus:事务状态类,通过PlatformTransactionManager的getTransaction方法根据事务定义获取;获取事务状态后,Spring根据传播行为来                 * 决定如何开启事务;
		 */
		DefaultTransactionDefinition def = new DefaultTransactionDefinition();
		def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
		def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
		/**
		 * getTransaction开启一个事物
		 */
		TransactionStatus status = txManager.getTransaction(def);
		try {
			System.out.println(jdbcTemplate.queryForInt(COUNT_SQL));
			txManager.commit(status);
		} catch (RuntimeException e) {
			txManager.rollback(status);
		}
	}


5、使用低级别解决方案进行事务管理器的测试

         /**
	 * 使用低级别解决方案来进行事物管理器测试
	 * @throws SQLException 
	 */
	@Test
	public void testPlatformTransactionManagerForLowLevel() {
		DefaultTransactionDefinition def=new DefaultTransactionDefinition();
		def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
		def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
		TransactionStatus status=txManager.getTransaction(def);
		//因為我用的是Oracle,所以下面用OracleConnection
		OracleConnection conn= (OracleConnection) DataSourceUtils.getConnection(dataSource);
		try {
			PreparedStatement ps=conn.prepareStatement(INSERT_SQL);
			ps.setString(1, "ccc");
			ps.setString(2, "222");
			ps.execute();
			txManager.commit(status);  //之前没有提交的时候数据库里面一直插不进数据,原来需要提交,多谢师弟提醒,好好向别人学习
		} catch (Exception e){  //因为我插入了很多此,但是一直没提交,所以id增加到了43,但是提交的结果是随后一次提交的结果
			 status.setRollbackOnly();  
		      txManager.rollback(status); 
		}finally{
			DataSourceUtils.releaseConnection(conn, dataSource);
		}
	}	

低级别方案中使用DataSourceUtils获取和释放连接,使用txManager开管理事务,而且面向JDBC编程,比起模板类方式来繁琐 和复杂的多,因此不推荐使用该方式


1.2、使用TransactionTemplate进行编程式事物管理

于使用PlatformTransactionManager进行事物管理的流程是固定的,各个事物管理期间只有部分逻辑存在差异,可以考虑像Springde的数据访问层那样,使用模板方法模式与Callback相结合的方式,对直接使用PlatformTransactionManager进行事物管理的代码进行封装,这样就有了更加方便的编程式事物管理方式,即使用TransactionTemplate的编程式事物管理。org.springframework.transaction.support.TransactionTemplate对与PlatformTransactionManager相关的事物界定操作以及相关的异常处理进行了模板化封装,开发人员更多的关注于通过相应的Callback接口提供具体的事物界定内容即可。Spring针对TransactionTemplate提供了两个Callback回调接口

TransactionCallback:通过实现该接口的“T doInTransaction(TransactionStatus status) ”方法来定义需要事务管理的操作代码TransactionCallbackWithoutResult:继承TransactionCallback接口,提供“void doInTransactionWithoutResult(TransactionStatus status)”便利接口用于方便那些不需要返回值的事务操作代码。

下面是的TransactionTemplate模板类的使用:

         /**
	 * 使用TransactionTemplate  模板类用于简化事物管理,事物管理由模板类定义
	 * 具体操作由TransactionCallback接口或TransactionCallbackWithoutResult回调接口指定
	 * 每天有事物管理代码,而是由模板类来完成事物管理,这样简单多了
	 */
	@Test
	public void testTransactionTemplate(){
		TransactionTemplate transactionTemplate=new TransactionTemplate(txManager);
		transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
		transactionTemplate.execute(new TransactionCallbackWithoutResult(){

			@Override
			protected void doInTransactionWithoutResult(TransactionStatus arg0) {
				//jdbcTemplate.update(INSERT_SQL,"jc","333");
				jdbcTemplate.update(INSERT_SQL, new Object[]{"jc","333"});
			}
		});
	}	

TransactionTemplate :通过new TransactionTemplate(txManager)创建事务模板类,其中构造器参数为PlatformTransactionManager 实现,并通过其相应方法设置事务定义,如事务隔离级别、传播行为等,此处未指定传播行为,其默认为PROPAGATION_REQUIRED;

TransactionCallbackWithoutResult:此处使用不带返回的回调实现,其doInTransactionWithoutResult方法实现中定义了需要事务管理的操作;

transactionTemplate.execute():通过该方法执行需要事务管理的回调。


对于JTA的分布式事物这里我没有实现。感觉太麻烦了
通过上面的实践,我基本会使用PlatformTransactionManager和TransactionTemplate进行简单事务处理了,那如何应用到实际项目中去呢?
我将在下篇博客中实现。


orangepi 5 plus ubuntu24.04上安装redroid OrangePi 5 Plus运行reDroid云手机方案总结 在RK3588+Ubuntu 24.04上部署reDroid(Android容器化方案)的关键步骤: 内核要求:确保启用binderfs(无需ashmem,新版reDroid使用memfd替代); 安装流程: 安装Docker并配置代理加速镜像拉取; 拉取reDroid镜像(推荐Android 12/13 ARM64版本); 通过挂载binderfs启动容器,指定分辨率与DPI参数; 多实例管理: 脚本化创建多个容器(如8个实例),分配独立端口 阅读详情

相关推荐

Jetson Nano官方镜像下载&烧录

在NVIDIA Jetson Nano开发者套件上安装NVIDIA官方Ubuntu镜像

weixin_44222088的博客 8615

编程式事务

所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。        Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务都是采用相同的API进行编程。   java代码: 查看复制到剪贴板打印 Connection conn = null;   UserTransaction tx = null;   try {       t...

weixin_34150224的博客 145

关于Sybase ASE数据库的license以及试用版过期的问题的解决方案

当用户从Sybase官网上下载了ASE15.0.2以后,如果选择了安装Express Edition或者Developer Edition,基本上不会碰到什么问题,除了有些功能受限以下。 但大多数可能选择了Enterprise Edition for Evaluation类型,即企业版试用。都会碰到这样的问题,即一个月以后,license过期,无法启动server。于是很郁闷,可能大部分人,会选...

iihero@CSDN 756

Spring 编程式事务 声明式事务

编程式事务通用类: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.stereotype.Component; imp...

CNZYYH的博客 525

【第九章】 Spring的事务 之 9.3 编程式事务 ——跟我学spring3

9.3  编程式事务 9.3.1  编程式事务概述        所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。        Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务都是采用相同的API进行编程。   java代码: Connection conn = null; UserTransaction tx = nu...

jinnianshilongnian的专栏 689

深入理解 Spring 事务原理【转】

本文转自码农网– 吴极心原创 连接地址:http://www.codeceo.com/article/spring-transactions.html 一、事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con ...

weixin_30679823的博客 870

spring中事务传播下,特殊方法手动控制事务

在开发中,遇到事务问题:从excel文件中解析导入数据,每个sheet页中的数据作为单个的事务单元提交数据库。解析下代码实现: 方法①:mainAnalysisEntrance(…)解析excel入口和权限和其他业务等处理; 方法②:analysisWorkbook(…)解析excel工作簿; 方法③:analysisPerSheet(…)解析每一个s...

weixin_33826268的博客 238

Spring事物管理

本文介绍了Spring事物管理的两种方式,即编程式事物和声明式事物。 一.认识事物 事物是以可控制的方式限定程序对数据资源进行访问的一组操作;它的目的是为了保证程序运行中数据资源的正确性和完整性,为了达到这个目的,事物拥有以下四个属性: 1.原子性:原子性要求事物所包含的这一组操作是一个不可分割的整体,要么这组操作全部成功,要么其中一个失败,即整个事物失败; 2.一致性:一致性要求事

wj481199的专栏 535

Spring事物管理

事物可以看做是由对数据库的若干操作组成的一个单元事物是一系列的动作,一旦其中有一个动作出现错误,必须全部回滚,提供将事物中对数据库的所有已完成的操作全部撤销,滚回到事物开始的状态,避免出现由于数据不一致而导致接下来的一系列错误.事物的出现是为了确保数据的完整性和一致性,确保用户的每一个操作都是可靠的,事物中的每一步操作都必须执行,只要有发生异常就回退到事物未开始的操作状态,这些事物要么都执行,要么都取消,从而保证数据满足原子性,一致性.在目前的企业开发中,事物管理是必不可少的.

weixin_52629592的博客 535

Spring + mybatis事物管理

Spring和mybatis结合后,由Spring接管mybtis事物。此配置适应于扩展性事物。具体配置如下 第一步:applicationContext.xml相关配置如下: <bean id="transactionManager" class="org.springframework.jdbc.

wangzhongfeng1112的专栏 1554

Spring 使用注解方式进行事物管理

Spring 使用注解方式进行事物管理大家在使用spring的注解式事务管理时,对事务的传播行为和隔离级别可能有点不知所措,下边就详细的介绍下以备方便查阅。事物注解方式: @Transactional当标于类前时, 标示类中所有方法都进行事物处理例子:@Transactional public class TestServiceBean implements TestService {}当类中某些方

张勤一 1122

Spring之声明式事物管理

注意:大多数Spring框架使用者采用声明式事物管理

luccs624061082的专栏 840

spring事物管理具体做法

一般情况下,事物管理标签都是在service层添加,因为在一个service层方法中,可能调用好几个dao层放法,要确保多个dao层放法在一个事物管理中进行。只需要对需要在spring事物管理中运行的方法进行配置,这样方法就会自动进行。基于xml配置(与配置aop是一模一样的)3.加@Transactional注解。还是需要在代码中自己进行控制。事物的提交和回滚(出异常)2.开启注解事物管理

buxiangchaozuoye的博客 105

Spring事物管理

事物是什么 事物可以看作是对一次对数据库的若干操作组成的一个单元。 我们在企业开发级的项目时,面对业务人员的一个操作,但实际上要对数据库读写的多步操作的集合。由于数据操作在顺序执行的过程中,任何的一步操作都是有可能发生异常的。异常就会导致后面的步骤午饭完成。但此时业务逻辑没有正确的完成(走通一整个流程)。那之前的操作数据结果可能就根本不可靠,那就在这种情况下,应该进行回退。 而事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都是必须成功顺利执行的。只要出现了异常了就回退到事务的开始未进行

古城的博客 1099

Spring事物管理器配置

Spring自带事物管理器,只需要配置一下,方法进行规范命名即可第一步:创建一个Spring事物管理器第二步:配置行为propagation="REQUIRED" 指如果当前有事物就在该事物中执行,如果没有,就开启一个新的事物(增删改查中)propagation="SUPPORTS" read-only="true"  指如果有就执行该事物,如果没有,就不会开启事物(查询中)第三步:配置AOP切面...

何阳的博客 1万+

spring 事物管理

一、什么是事物事物就是把一系列的动作当做一个独立的工作单元,这些动作要么全部完成,要么完成不了 特点:原子性,隔离性,持久性,一致性 分类: 编程式事务管理 将事务管理代码嵌到业务方法中来控制事务的提交和回滚 缺点:必须在每个事务操作业务逻辑中包含额外的事务管理代码 声明式事务管理 将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。 通过Spring...

weixin_44615754的博客 214

spring事物管理

spring事物管理 1.数据库的隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题。 Read UnCommitted(读未提交) 最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。 Re...

sdad2330716的博客 265

Spring Transaction(事物)学习二、Spring事物管理

Spring Transaction(事物)学习二、Spring事物管理 文章目录Spring Transaction(事物)学习二、Spring事物管理1、配置事物管理器2、启用事物3、@Transactional注解的默认配置 记录一下对Spring和数据库事物的学习,这里的Spring事物学习使用的是全注解的形式 思维导图: 1、配置事物管理器 在Spring注解启动事物的配置中,如果想要启用事物,就需要配置事物管理器,就像是不同的数据库需要不同的驱动一样,Spring中也有多种事务管理器,D

fengxiandada的博客 706

spring事物管理及@Transactional注解用法

一、什么是事物        在我们开发过程中,有很多需要事物的业务场景。比如:在我们转账的场景中,用户A需要转账500元给用户B。在用户A账户中扣除500元后,发生了异常,这时候用户B增加500元的语句可能就不会执行。就会导致转账的丢失。此时就需要事物管理将扣除500元的操作进行回滚。也就是说事物内的语句,要么全部执行成功,要么全部执行失败。 二、事物管理的几种方式 spring中的事物...

刘辉的专栏 701

Spring 事物管理

/ 注入数据源// 注入事务管理器// 注入TransactionTemplate模板// 获得数据库连接try {// 执行两次添加方法stmt.execute("insert into tb_user(name,age,sex) values('小强','26','男')");int a = 0;// 制造异常测试事务是否配置成功a = 9 / a;

m0_71001684的博客 114

OpenClaw本地部署指南[代码]

本文档详细介绍了在Windows系统上部署OpenClaw并连接本地Ollama模型的完整步骤。从硬件和软件的准备工作开始,包括安装Ollama、下载和配置模型,到安装和配置OpenClaw,以及解决常见的上下文窗口错误。此外,还提供了安装常用技能的方法和解决常见问题的方案,确保用户能够顺利搭建并运行一个具备智能体能力的OpenClaw系统。文档内容全面,步骤清晰,适合从零开始的用户参考。

nltk_data.zip

英文的分词nltk包,进行分词或者其他操作依赖的词库,停用词库的资源包,下载后解压放到默认的资源路径linux:/usr/share/nltk_data,nltk包就可以正常使用

上一篇: Spring NamedParameterjdbc详解和如何获得主键自增值
下一篇: Spring管理事物应用到实际的项目中--编程式事物
cwzhsi
博客等级 码龄14年 65粉丝 117原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值