Spring事务管理详解_基本原理_事务管理方式

Spring事务管理详解_基本原理_事务管理方式

1. 事务的基本原理

Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交,那在没有Spring帮我们管理事务之前,我们要怎么做。

Connection conn = DriverManager.getConnection();
try {  conn.setAutoCommit(false);  //将自动提交设置为false                         
    执行CRUD操作 conn.commit();      //当两个操作成功后手动提交  
} catch (Exception e) {  conn.rollback();    //一旦其中一个操作出错都将回滚,所有操作都不成功
    e.printStackTrace();  
} finally {conn.colse();
}

事务是一系列的动作,一旦其中有一个动作出现错误,必须全部回滚,系统将事务中对数据库的所有已完成的操作全部撤消,滚回到事务开始的状态,避免出现由于数据不一致而导致的接下来一系列的错误。事务的出现是为了确保数据的完整性和一致性,在目前企业级应用开发中,事务管理是必不可少的。

2. 常见spring事务面试题

2.1 什么是事务?

单个逻辑单元执行一系列的事,要么全成功,要么全不执行。

spring事务的本质就是对数据库事务的支持,没有数据库的事务支持,spring是无法完成事务的。

对于纯jdbc操作数据库,使用事务如下:
Connecton con = DriverManager.getConnection();
con.setAutoCommit(false);
//执行crud 操作
con.commint();//提交事务
或者回滚事务 con.rollback();

2.2 spring的核心。

1、spring的核心就是ioc控制反转跟aop面向切面编程。

2、ioc控制反转
控制:强调对象是由容器控制的,控制了对外部资源的获取。
反转:以前都是我们自己创建对象依赖对象,反转就是由容器帮我们创建并
注入依赖对象。

3、aop面向切面编程
aop将封装的对象切开,找出对多个对象产生公共影响的部分,将其封装成一个可复用的模块,这个模块成为切点,切点把不属于业务层,却被业务层共同调用的部分进行提取然后封装。

3. spring事务管理方式

spring支持编程式事务管理和声明式事务管理两种方式。

3.1 编程式事务管理(了解)

编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

3.2 声明式事务管理(重点)

声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。

3.3 事务管理小结

显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。

4. 总结

通过这篇文章,你要get到的知识点是“事务的基本概念”、以及spring事务管理的两种方式。

“事务的基本概念”通常是初级工程师面试的一个热点。

而spring事务管理的两种方式,你要明确在实际开发中,用到的只是声明式事务管理,比如:@Transactional注解;

而声明式事务注解又有两种常用的配置方式,所以如果你只知道@Transactional注解是不行的,

下一篇文章将告诉你如何在xml中配置,以致在开发中能够使用该注解。

 

声明式事务管理两种常用的方式(基于tx和aop名字空间的xml配置 + @Transactional注解)

 

本文地址:http://www.cnblogs.com/niceyoo/articles/8729525.html

 

posted @ 2018-04-07 00:12 niceyoo 阅读(...) 评论(...) 编辑 收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ORA-28000: the account is locked

首先使用具有sysdba权限的账户登陆,如sys账户和system账户 新建一个sql窗体,并执行语句解锁被锁定的账户,如我这里sgyw账户: alter user sgyw account unlock; 执行成功后再次用这个账户就可以登陆系统了。

工作227:小程序学习1开始布局页面

<template><view class"box u-p-l-35 u-p-r-35 "><view class"title"><text>请选择您要管理的市场</text></view><view :class" [u-flex,u-row-center,{choose_market: selectIndex 0},{market : selectIndex…

windows下安装和使用scrapy

首先&#xff0c;要确保已经正确安装了python环境&#xff0c;并安装了pip包 接着&#xff0c;打开cmd或者powershell &#xff0c;输入命令 pip install scrapy 。安装完之后 运行scrapy性能测试命令&#xff1a; scrapy bench 。此时可能出现“import win32api&#xff0c;Im…

spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)

1. 声明式事务管理分类 声明式事务管理也有两种常用的方式&#xff0c; 一种是基于tx和aop名字空间的xml配置文件&#xff0c;另一种就是基于Transactional注解。 显然基于注解的方式更简单易用&#xff0c;更清爽。 2. spring事务特性 spring所有的事务管理策略类都继承自org.…

oracle中如何设置主键并且让其自动增长

1、创建数据库 create table USERINFO ( USERNO NUMBER not null, USERNAME NVARCHAR2(20), USERPWD NVARCHAR2(20) ) 2、创建触发器 create sequence SEQ_Userinf start with 1 increment by 1 nomaxvalue nominvalue nocache; CREATE OR REPLACE TRIGGER tg_test BEFORE …

工作228:小程序学习2开始布局页面2

<template><view class"box u-p-l-35 u-p-r-35 "><view class"title"><text>请选择您要管理的市场</text></view><view :class" [u-flex,u-row-center,{choose_market: selectIndex 0},{market : selectIndex…

AngularJs通过路由传参解决多个页面资源浪费问题

在实际开发中会遇到很多类似模块界面大体都一致只是极少的细节部分不一样&#xff0c;这时不管是在html页面还有js及数据交互的时候我们就没必要因为这些不同的页面分出不同的文件&#xff0c;这样很浪费内存及效率&#xff0c;于是我在开发中想到一种办法&#xff1a;通过ng路…

mybatis BindingException: Invalid bound statement (not found)

错误截图 解决措施 此异常的原因是由于mapper接口编译后在同一个目录下没有找到mapper映射文件而出现的。 通常我们在配置SqlSessionFactory时会有如配置 1 <!-- 配置SqlSessionFactory -->2 <bean class"org.mybatis.spring.SqlSessionFactoryBean">…

myeclipse快捷生成代码块

1、快捷键啊 altshifts 2、右键 -——Source

前端学习(2712):重读vue电商网站32之让菜单栏展开与折叠

通过点击一个按钮&#xff0c;让侧边栏进行展开与折叠。通过 isCollapse 的值来动态变化侧边栏的宽度。 其中 cursor: pointer 设置是为了让鼠标放在折叠与展开处会有一个手指指向。 letter-spacing: 0.2em 是为了让 ||| 有一定间隔

Myeclipse下Maven的配置

1.配置    window--Preferences JDK的配置(执行命令&#xff0c;控制台可能无法输出) -Dmaven.multiModuleProjectDirectory$MAVEN_HOME 新建 Maven Project 转载于:https://www.cnblogs.com/xdalsh/p/8399299.html

Hibernate访问数据库,HibernateTemplate操作数据库,实现增删改查

1、首先创建封装Hibernate的Dao类 import java.io.Serializable; import java.util.List; import javax.annotation.Resource; import org.springframework.orm.hibernate5.HibernateTemplate; import org.springframework.stereotype.Component; Component public class U…

前端学习(2713):重读vue电商网站33之实现首页路由重定向

我们想要在登录之后重定向到 /welcome 路径&#xff0c;于是需要添加子路由children 属性&#xff0c;然后设置 redirect重定向到我们的子路由。 然后在我们组件 Home.vue 的右侧主体区域&#xff0c;放置一个路由占位符 router-view 即可。

@Value(${xxxx})注解的配置及使用

代码中的用法 Spring 通过Value注解获取*.porperties文件code的内容&#xff0c;然后赋值给使用该注解的Code属性上。 Value("${code}") private String Code; 看一下这个resource.properties文件&#xff08;resource为文件名称&#xff09; code002 spring中的配置…

国家语言,语言代码,locale id对应表

国家语言&#xff0c;语言代码&#xff0c;locale id对应表。比如 en_US对应的id为1033&#xff0c; 中文的localezh_CN&#xff0c;id2052. LocaleLanguagecodeLCIDstringLCIDDecimalLCIDHexadecimalCodepageAfrikaansafaf10784361252Albaniansqsq1052 1250Amharicamam1118 A…

myeclipse链接数据库,SQL语句实现增删改查

1、创建properties文件 #oracle #driveroracle.jdbc.OracleDriver #urljdbc\:oracle\:thin\:localhost\:1521\:xe #usernamesystem #passwordmanager #mysql drivercom.mysql.jdbc.Driver urljdbc\:mysql\://192.168.0.121\:3306/test?user\root&password\root&chara…

前端学习(2714):重读vue电商网站34之侧边栏路由改造

通过给侧边栏设置 router 属性为 true&#xff0c;我们就能开启 vue-router 路由模式&#xff0c;然后将我们二级菜单的 index 属性绑定我们的数据 path 即可。

(转)spring中的拦截器(HandlerInterceptor+MethodInterceptor)

1. 过滤器跟拦截器的区别 在说拦截器之前&#xff0c;不得不说一下过滤器&#xff0c;有时候往往被这两个词搞的头大。 其实我们最先接触的就是过滤器&#xff0c;还记得web.xml中配置的<filter>吗~ 你应该知道spring mvc的拦截器是只拦截controller而不拦截jsp,html 页…

ASP.NET Core源码学习(一)Hosting

ASP.NET Core源码的学习&#xff0c;我们从Hosting开始&#xff0c; Hosting的GitHub地址为&#xff1a;https://github.com/aspnet/Hosting.git 朋友们可以从以上链接克隆或是下载。 为什么是从Hosting开始学习呢&#xff1f;我们来看看ASP.NET Core MVC项目中的Pragram.CS中的…

前端学习(2715):重读vue电商网站35之在sessionStorage保存左侧菜单栏的激活状态

为了让我们点击二级菜单时&#xff0c;会有一个激活效果&#xff0c;而且是保持状态&#xff0c;我们需要将利用 element-ui 菜单栏相关 default-active 属性&#xff0c;来让菜单保持激活。 由于每个二级菜单都有一个路由链接&#xff0c;不妨将路由路径 path 存储在 sessionS…