Spring声明式事务管理与配置介绍

Spring Boot 多数据源及事务解决方案 3.2.1 定义管理接口通过继承即可实现。为了方便对数据源进行操作,我们定义一个接口,为业务提供操作数据源的统一接口。该接口主要是对数据表中定义的数据源,提供基础管理功能。3.2.2 自定义数据源的实现如下图所示:根据前面的分析,是在容器启动的时候,执行注入数据源对象,完成之后无法对数据源进行修改。则实现接口,可以将数据表中的数据源加载到dataSources。3.2.3 切面处理这一块的处理跟配置文件数据源方案处理方式相同,都是通过AOP技术切换lookup key。 阅读详情

本文摘自:http://java.9sssd.com/javafw/art/1215

一、Spring声明式事务配置的五种方式

前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。

总结如下:

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。

具体如下图:

Spring声明式事务配置

根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:

第一种方式:每个Bean都有一个代理

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
4 xmlns:aop="http://www.springframework.org/schema/aop"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
7 http://www.springframework.org/schema/context
8 http://www.springframework.org/schema/context/spring-context-2.5.xsd
9 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
10
11 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
12 <property name="configLocation" value="classpath:hibernate.cfg.xml" />
13 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
14 </bean>
15
16 <!-- 定义事务管理器(声明式的事务) -->
17 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
18 <property name="sessionFactory" ref="sessionFactory" />
19 </bean>
20
21 <!-- 配置DAO -->
22 <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
23 <property name="sessionFactory" ref="sessionFactory" />
24 </bean>
25
26 <bean id="userDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
27 <!-- 配置事务管理器 -->
28 <property name="transactionManager" ref="transactionManager" />
29 <property name="target" ref="userDaoTarget" />
30 <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
31 <!-- 配置事务属性 -->
32 <property name="transactionAttributes">
33 <props>
34 <prop key="*">PROPAGATION_REQUIRED</prop>
35 </props>
36 </property>
37 </bean>
38 </beans>

第二种方式:所有Bean共享一个代理基类

1 ......
2 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
3 <property name="configLocation" value="classpath:hibernate.cfg.xml" />
4 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
5 </bean>
6
7 <!-- 定义事务管理器(声明式的事务) -->
8 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
9 <property name="sessionFactory" ref="sessionFactory" />
10 </bean>
11
12 <bean id="transactionBase" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">
13 <!-- 配置事务管理器 -->
14 <property name="transactionManager" ref="transactionManager" />
15 <!-- 配置事务属性 -->
16 <property name="transactionAttributes">
17 <props>
18 <prop key="*">PROPAGATION_REQUIRED</prop>
19 </props>
20 </property>
21 </bean>
22
23 <!-- 配置DAO -->
24 <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
25 <property name="sessionFactory" ref="sessionFactory" />
26 </bean>
27
28 <bean id="userDao" parent="transactionBase">
29 <property name="target" ref="userDaoTarget" />
30 </bean>

第三种方式:使用拦截器

1 ......
2 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
3 <property name="configLocation" value="classpath:hibernate.cfg.xml" />
4 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
5 </bean>
6
7 <!-- 定义事务管理器(声明式的事务) -->
8 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
9 <property name="sessionFactory" ref="sessionFactory" />
10 </bean>
11
12 <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
13 <property name="transactionManager" ref="transactionManager" />
14 <!-- 配置事务属性 -->
15 <property name="transactionAttributes">
16 <props>
17 <prop key="*">PROPAGATION_REQUIRED</prop>
18 </props>
19 </property>
20 </bean>
21
22 <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
23 <property name="beanNames">
24 <list>
25 <value>*Dao</value>
26 </list>
27 </property>
28 <property name="interceptorNames">
29 <list>
30 <value>transactionInterceptor</value>
31 </list>
32 </property>
33 </bean>
34
35 <!-- 配置DAO -->
36 <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
37 <property name="sessionFactory" ref="sessionFactory" />
38 </bean>

第四种方式:使用tx标签配置的拦截器

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:aop="http://www.springframework.org/schema/aop"
6 xmlns:tx="http://www.springframework.org/schema/tx"
7 xsi:schemaLocation="http://www.springframework.org/schema/beans
8 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
9 http://www.springframework.org/schema/context
10 http://www.springframework.org/schema/context/spring-context-2.5.xsd
11 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
12 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
13 <context:annotation-config />
14 <context:component-scan base-package="com.bluesky" />
15
16 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
17 <property name="configLocation" value="classpath:hibernate.cfg.xml" />
18 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
19 </bean>
20
21 <!-- 定义事务管理器(声明式的事务) -->
22 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
23 <property name="sessionFactory" ref="sessionFactory" />
24 </bean>
25
26 <tx:advice id="txAdvice" transaction-manager="transactionManager">
27 <tx:attributes>
28 <tx:method name="*" propagation="REQUIRED" />
29 </tx:attributes>
30 </tx:advice>
31
32 <aop:config>
33 <aop:pointcut id="interceptorPointCuts" expression="execution(* com.bluesky.spring.dao.*.*(..))" />
34 <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />
35 </aop:config>
36 </bean>

第五种方式:全注解

1 ......
2 <context:annotation-config />
3 <context:component-scan base-package="com.bluesky" />
4
5 <tx:annotation-driven transaction-manager="transactionManager" />
6
7 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
8 <property name="configLocation" value="classpath:hibernate.cfg.xml" />
9 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
10 </bean>
11
12 <!-- 定义事务管理器(声明式的事务) -->
13 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
14 <property name="sessionFactory" ref="sessionFactory" />
15 </bean>

此时在DAO上需加上@Transactional注解,如下:

1 @Transactional
2 @Component("userDao")
3 public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
4 public List<User> listUsers() {
5 return this.getSession().createQuery("from User").list();
6 }
7 ......
8 }

二、事务的传播属性(Propagation)

Propagation :key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

  • PROPAGATION_REQUIRED--加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务
  • PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
  • PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
  • PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

1: PROPAGATION_REQUIRED

加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务。

比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候,ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚。

2: PROPAGATION_SUPPORTS

如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行。

3: PROPAGATION_MANDATORY

必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常。

4: PROPAGATION_REQUIRES_NEW

这个就比较绕口了。 比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。

5: PROPAGATION_NOT_SUPPORTED

当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续ServiceA.methodA的事务。

6: PROPAGATION_NEVER

不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,那么ServiceB.methodB就要抛出异常了。

7: PROPAGATION_NESTED

理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。

而Nested事务的好处是他有一个savepoint。

1 ServiceA {
2 //事务属性配置为 PROPAGATION_REQUIRED
3 void methodA() {
4 try {
5 //savepoint
6 ServiceB.methodB(); //PROPAGATION_NESTED 级别
7 } catch (SomeException) {
8 // 执行其他业务, 如 ServiceC.methodC();
9 }
10 }
11 }

也就是说ServiceB.methodB失败回滚,那么ServiceA.methodA也会回滚到savepoint点上,ServiceA.methodA可以选择另外一个分支,比如:

ServiceC.methodC,继续执行,来尝试完成自己的事务。

但是这个事务并没有在EJB标准中定义。

三、Spring事务的隔离级别(Isolation level)

1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。

另外四个与JDBC的隔离级别相对应。

2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。

这种隔离级别会产生脏读,不可重复读和幻像读。

3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。

4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。

它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。

除了防止脏读,不可重复读外,还避免了幻像读。

什么是脏数据,脏读,不可重复读,幻觉读?

脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据,那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

幻觉读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

Spring TX配置(声明式事务管理+annotation) Spring的事务管理提供了对多种事务管理器的支持,如JDBC事务管理器、Hibernate事务管理器、JTA事务管理器等,以适配不同的数据访问技术。总的来说,Spring的事务管理使得数据库操作更加简单、可靠和灵活,提高了应用程序的性能和稳定性。 阅读详情

相关推荐

Spring3和Hibernate4中注解方式的声明式事务管理配置

Spring框架自2003年问世以来,已成为Java企业级应用开发的事实标准。它致力于简化企业级应用开发,提供了一整套的解决方案,从基础的控制反转(IoC)和面向切面编程(AOP),到事务管理、数据访问、消息服务等。Spring的出现,让开发者能够专注于业务逻辑的实现,而不必过多地担心底层的实现细节。

weixin_33308579的博客 853

Spring | 事务原理与实践 - 声明式事务及编程式事务

事务是由数据库管理系统在执行过程中形成的一个逻辑单位,它由一组有限的数据库操作序列组成。通常情况下,事务是由程序单元通过高级语言或数据库的数据操作语言提交的。至此,本篇结束。本文全面深入地探讨了Spring事务的原理、管理类型、深度剖析以及在复杂业务场景中的应用。通过对Spring事务的深度剖析和实际应用案例的探讨,我们可以更加清晰、准确地理解Spring事务在实际开发中的运用,更加灵活地处理各种复杂的业务场景。在实际开发过程中,精确地把握事务边界、合理配置事务属性以及灵活应用分布式事务是至关重要的。

StudyBrainEx 1500

3分钟接入满血版DeepSeek-R1:字节火山引擎手把手教程!免费50万tokens!

3分钟接入满血版DeepSeek-R1:字节火山引擎手把手教程!免费50万tokens!

hunteritself的博客 2万+

【Spring学习33】Spring事务(3):事务属性之隔离级别(isolation level)

事务属性上文的例子中,在声明事务时,用到了@Transactional(readOnly = false, propagation = Propagation.REQUIRED)。 中间的参数readOnly,propagation我们称为事务属性。它就是对事务的基本配置。事务属性有五个方面:传播行为,隔离级别,事务超时时间,回滚规则,是否只读。 由属性接口TransactionDefiniti

程序老兵的博客 2万+

从零构建HFSS连接器仿真模型:以SMP接口的精准复现为例

本文详细介绍了如何从零构建HFSS连接器仿真模型,以SMP接口的精准复现为例。通过获取官方模型、导入技巧、信号路径提取和介质结构复现等步骤,帮助工程师避免常见错误,提升高频电路仿真的准确性。文章特别强调了模型精度对仿真结果的影响,并提供了实用的调试和管理建议。

weixin_29041767的博客 430

从Simulink仿真到DSP28335真机部署:PID闭环控制快速移植指南

本文详细介绍了如何将Simulink中的PID闭环控制算法快速移植到DSP28335嵌入式平台。通过模型与代码映射、浮点与定点数选择、定时器中断配置、物理输出实现以及调试技巧五个关键步骤,帮助工程师高效完成从仿真到真机部署的全过程,特别适合需要实现精确控制的嵌入式开发者。

weixin_42521843的博客 363

SpringBoot 基于TDDL实现MySQL分库分表

本文介绍了如何使用TDDL实现MySQL分库分表,并通过一个简单的示例演示了如何配置TDDL、创建数据表和实体类、编写DAO层代码以及测试分库分表。TDDL是一款功能强大的数据库中间件,支持丰富的分片规则和路由策略,可以提高数据库的扩展能力和性能。如果您的应用程序需要进行数据库水平扩展,TDDL可能是一个不错的选择。不过,在实际应用中,您需要根据具体的业务需求和实际情况选择适合的数据库中间件,并进行合理的配置和优化。

Java老兵的后端进阶与AI前沿探索之路。 2762

SAP 财务接口开发:完全清账 vs 标准过账的 CO-PA(获利能力字段) 赋值全解析(含设计哲学)

用于完全清账场景:用于标准凭证过账/部分清账两者对 CO-PA 数据的传递方式截然不同。本文不仅提供完整的代码实现,更深入解析为什么 SAP 要这样设计——了解设计哲学,才能灵活应对各类需求。完全清账→ 调用,必须在T_FTPOST中传递,其他特征用BSEG-RKE_前缀。标准过账/部分清账→ 调用,在CRITERIA表中传递特征,字段名直接用WERKSARTNR等。SAP 的设计智慧面向不同场景,采用不同机制,各司其职。通过接口抽象,将复杂的 CO-PA 配置逻辑封装在内部,对外提供简洁的调用方式。

Pegasus666的博客 328

Spring事务管理——使用XML配置声明式事务

事务简介:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性事务就是一系列的动作,它们被当作一个单独的工作单元。这些动作要么全部完成,要么全部不起作用事务的四个关键属性(ACID)① 原子性(atomicity):事务室一个原子操作,有一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用② 一致性(consistency):一旦所有事务动作完成,事务就被提交。

Evankaka的专栏 1万+

基于激光雷达的目标跟随功能移植到自己的ROS机器人小车上

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、下载目标跟随的源码二、修改话题名称1.修改/cmd_vel话题名称2.修改/scan话题名称3.修改双电机正反转4.目标跟随功能测试 前言 本人尝试把github上的一个目标跟随项目移植到自己的机器人小车上,并且成功了,最终小车可以跟着人移动,在这里分享一下心得。基于激光雷达的目标跟随,通过获取激光雷达的信息,跟随最近的物体。 提示:以下是本篇文章正文内容,下面案例可供参考 一、下载目标跟随的源码 源码地址:https:

weixin_44574633的博客 4463

OpenClaw 在 Docker 容器中的部署实战——零配置启动

本文介绍了OpenClaw在Docker容器中的快速部署方法,对比了本地部署与容器化部署的优势。通过官方镜像和Docker Compose两种方式,5分钟即可完成部署,并详细讲解了配置管理方案(挂载配置文件和环境变量)。文章还提供了飞书集成配置方法,以及生产环境下的日志管理、资源限制、健康检查等优化建议。最后包含常见问题排查指南,帮助开发者快速实现OpenClaw的容器化部署。

刘一说的IT专栏 907

Spring声明式事务管理:深入探索XML配置方式

Spring声明式事务管理:XML配置方式

weixin_52937170的博客 1294

【24E】SWT6652 wifi驱动加载失败问题分析及解决方案

修改驱动配置Kconfig。是由于内存分配失败导致。

wgl307293845的博客 219

Spring声明式事务管理之XML配置

大多数Spring Framework的用户选择声明式事务管理. 这种方式对应用代码的影响最小, 并且最符合一个非 侵入型轻量级容器的理想. 声明式事务管理,使用maven导入以下依赖 <dependencies> <!-- spring--> <!-- https://mvnrepository.com/artifact/org.spri...

weixin_42325327的博客 235

智能车图像处理0-变量释义

这篇文章主要讲述智能车图像处理中,各篇主要变量的含义。如果在看具体分析代码时感到困惑,可以在本篇文章中查询,辅助理解。

taiyuezyh的博客 3687

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring JDBC与事务管理6:Spring声明式事务一:声明式事务配置;

说明: (1)在【Spring JDBC与事务管理5:Spring编程式事务;】已知,编程式事务虽然易于理解,但是由于程序员水平问题或疏忽问题,可能会出现忘记编写事务控制代码的情况;为此,声明式事务应运而生; (2)这一点要明确:声明式事务不是新技术,而是【Spring AOP面向切面编程】一个典型的应用场景而已; 一:声明式事务简介 (1)声明式事务不是新技术;而是,【Spring AOP面向切面编程】一个典型的应用场景而已; (..

小枯林的博客 749

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring事务管理(XML配置声明式)

java事务管理主要有三种:JDBC事务、JTA事务、容器事务,主要来看一下容器事务。 首先来回顾一下什么是事务。 事务:指逻辑上的一组操作,这组操作要么全部成功,要么全部失败。 事务的特性(ACID): 1、原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 2、一致性:事务执行的前后数据的完整性必须保持一致。 3、隔离性:多个用户并发访问数据库时,一个用户

lishuangting的博客 559

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Spring声明式事务管理之注解配置

Spring声明式事务注解需要使用到:@Transactional注解 该注解的属性: 属性名 说明 name 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。 propagation 事务的传播行为,默认值为 REQUIRED(一定会有事务)。 isolation 事务的隔离度,默认值采用 DE...

weixin_42325327的博客 253

Spring的事务操作一站式学习【事务的概念、注解声明式事务管理、声明式事务管理参数配置、XML声明式事务管理、完全注解声明式事务管理】(超详细)

目录事务的概念搭建事务操作的环境创建数据库表,添加记录代码演示事务场景引入事务管理介绍注解声明式事务管理声明式事务管理参数配置propagation:事务传播行为ioslation:事务隔离级别timeout:超时时间readOnly:是否只读rollbackFor:回滚noRollbackFor:不回滚XML声明式事务管理(不常用)完全注解声明式事务管理 事务的概念 事务的概念(通俗理解):事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败。 典型场景:银行转账(这两件

『愚』的博客 4456

spring事物配置,声明式事务管理和基于@Transactional注解的使用

事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。 spring支持编程式事务管理和声明式事务管理两种方式。 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。  声明式事务管理建立在

不学习就淘汰 30万+

Spring声明式事务管理的配置详解

环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可。添加方法: 点击项目右键->Build Path->Add librarys:                                  打开

sunny_na的博客 578

【Spring】事务配置,声明式事务管理和基于@Transactional注解的使用

一、事务的概念 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。 事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所有操作。 详细请参考我之前的博客:https://blog.csdn...

zzf_forgot的博客 343

spring声明式事务管理配置及说明

一、spring声明式事务管理配置及说明(配置在配置文件中,此处的配置文件名称为:applicationContext.xml)     Spring中配置声明式事务管理的几种方式:        一种:----------------------------------------------------------------- <!-- 定义切入点 express

漂流幻境 3162

Spring声明式事务管理的配置

要想在Spring里面使用声明式事务管理,首先需要导入四个Jar包(如下图): 导入jar包后,还需要在Spring的配置文件里加入一段代码: 这段代码就是要交给上面那段代码里的pointcut去执行 声明式事务管理除了用以上的方法外还有一种方法,那就是使用注解 先在Spring配置文件里加入一段代码: 接着在service类里面加

J_________的博客 368
上一篇: 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法
下一篇: Flashcache at Facebook: From 2010 to 2013 and beyond
wupangzi
博客等级 码龄24年 14粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值