Spring的JDBC事务实现
之前项目中有大量数据提交的需求,考虑了几个解决方案后还是觉得使用事务提交效率更高、数据插入也更方便。
一、首先,让我们来看看什么是事务
事务(Transaction)是并发控制的单元,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,sql server能将逻辑逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。事务通常由begin transaction开始,以Commit或者Rollback结束。Commit表示提交,即提交事务的所有操作,具体的说就是将事务中所有对数据的更新写回到数据库的物理磁盘上,事务正常结束。Rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库 的所有已完成的操作全部撤销,滚回到事务开始的状态。
事务具有以下特性:
1、原子性(Atomicity):事务是数据库的逻辑工作单元,必须是原子工作单位,事务的原子性确保动作要么全部执行,要么全部不执行。
2、一致性(Consistency):事务在完成时,系统必须确保所有的数据处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
3、隔离性(Isolation):一个事务的执行不能被其他事务所影响。
4、持久性(Durability):一个事务一旦提交,事务的操作便永久的保存在DB中,即使此时再执行回滚操作也不能撤销所做的更改。无论发生什么系统错误,它的结果都不应该受到影响。
事务可分为以下几种:
1、自动提交事务
每条单独的语句都是一个事务。每个语句后都隐含一个commit。
2、显式事务
以begin transaction开始,以Commit或者Rollback结束。
3、隐式事务
当连接以隐式事务模式进行操作时,sql server数据库引擎实例将在提交或回滚当前事务后自动启动新事务,无需描述事务的
开始,只需提交或回滚每个事务,但每个事务仍以Commit或者Rollback显式结束。连接将隐式事务模式打开后,为数据库引擎实例
首次执行以下任何语句时,都会自动启动一个隐式事务:alter table,insert,create,open,delete,revoke,drop,select,
fetch,truncate table,grant,update。在发出commit或rollback语句之前,该事务将一直保持有效。在第一个事务被提交或回
滚之后,下次当连接执行以上任何语句时,数据库引擎实例都会自动启动一个新事务。该引擎将不断生成隐式事务链,直到隐式事
务模式关闭为止。
二、Spring对事务的支持
Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。 Spring事务管理器的接口org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。
此接口的内容如下:
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事务管理的一个优点就是为不同的事务API提供一致的编程模型,如JTA、JDBC、Hibernate、JPA等。
三、事务应用实例
本实例主要解决了提交大量数据的需求,使用JDBC事务实现。
1、那么如何使用JDBC事务呢?
如果应用程序中直接使用JDBC来进行持久化,DataSourceTransactionManager会来处理事务边界。为了使用DataSourceTransactionManager,我们需要使用如下的XML将其装配到应用程序的上下文定义中:
<!-- (事务管理)transaction manager--><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean>
实际上,DataSourceTransactionManager是通过调用java.sql.Connection来管理事务,而后者是通过DataSource获取到的。通过调用连接的commit()方法来提交事务,同样,事务失败则通过调用rollback()方法进行回滚。 2、话不多说,直接上实现代码
/*** 数据提交* @return*/
@RequestMapping(value = "/submitTerm.go", method = { RequestMethod.GET, RequestMethod.POST })
@ResponseBody
public void submitTerm(@RequestBody submitInfo submitInfo, HttpServletRequest request) throws Exception {//获取数据库连接WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();DataSource dataSource = wac.getBean(DataSource.class);Connection con = dataSource.getConnection();PreparedStatement ps = null;try {//设置事务的提交方式为非自动提交:con.setAutoCommit(false);// 创建执行语句String sql = "insert into dec_company_baseinfo (dwmc,addr,zzjgdm,yyzzzch,reg_time,postcode,"+ "e_mail,dw_url,jyfs,jyfw,dwzycp,hylb,hwyxjgs,qnydl,szzqjysc,gpdm,dkzhm,dwdjzclx,"+ "dwgsdjzh,dwdsdjzh,dwdh,dw_fax,zcszbsc,ssgxjsly,hwyfjgs,qnysl,gssssj,gfgsclfs,zczb,"+ "zczb_zz,zczb_wz,zczb_wzzb,sszb,sszb_zz,sszb_wz,sszb_wzzb,yfbgmj_lhn,yfbgmj_lhw,"+ "scyfmj_lhn,scyfmj_lhw,yyyfjg_country,yyyfjg_province,yyyfjg_city,yyyfjg_area,dwzz,"+ "dwzyzz,dwjbkhyh,khhm,yhxydj,yhzh,data_status,xzgl_num,scyx_num,yfsj_numjgzz_num,"+ "qtgw_num,bs_num,ss_num,bk_num,dz_num,qtxl_num,gjzc_num,zjzc_num,cjzc_num,qtzc_num,"+ "wjys_num,gdzjjhrc_num,lhxqgccrc_num,gjqrjhrc_num,szskqjhrc_num,gdcxcytd_num,"+ "szsgcczyrc_num,qtrc_num,snnmcyry_num,mzg_num,wzg_num,cjsb_num,lxgg_num,wjzj_num,"+ "snxzgxbys_num,sncpxssr,sndjlr,sndnsze,zzsze) values (#{dwmc},#{addr},#{zzjgdm},"+ "#{yyzzzch},#{reg_time},#{postcode},#{e_mail},#{dw_url},#{jyfs},#{jyfw},#{dwzycp},"+ "#{hylb},#{hwyxjgs},#{qnydl},#{szzqjysc},#{gpdm},#{dkzhm},#{dwdjzclx},#{dwgsdjzh},"+ "#{dwdsdjzh},#{dwdh},#{dw_fax},#{zcszbsc},#{ssgxjsly},#{hwyfjgs},#{qnysl},#{gssssj},"+ "#{gfgsclfs},#{zczb},#{zczb_zz},#{zczb_wz},#{zczb_wzzb},#{sszb},#{sszb_zz},"+ "#{sszb_wz},#{sszb_wzzb},#{yfbgmj_lhn},#{yfbgmj_lhw},#{scyfmj_lhn},#{scyfmj_lhw},"+ "#{yyyfjg_country},#{yyyfjg_province},#{yyyfjg_city},#{yyyfjg_area},#{dwzz},"+ "#{dwzyzz},#{dwjbkhyh},#{khhm},#{yhxydj},#{yhzh},#{data_status},#{xzgl_num},"+ "#{scyx_num},#{yfsj_numjgzz_num},#{qtgw_num},#{bs_num},#{ss_num},#{bk_num},#{dz_num},"+ "#{qtxl_num},#{gjzc_num},#{zjzc_num},#{cjzc_num},#{qtzc_num},#{wjys_num},"+ "#{gdzjjhrc_num},#{lhxqgccrc_num},#{gjqrjhrc_num},#{szskqjhrc_num},#{gdcxcytd_num},"+ "#{szsgcczyrc_num},#{qtrc_num},#{snnmcyry_num},#{mzg_num},#{wzg_num},#{cjsb_num},"+ "#{lxgg_num},#{wjzj_num},#{snxzgxbys_num},#{sncpxssr},#{sndjlr},#{sndnsze},#{zzsze})";String sql1 = "insert into dec_talent_baseinfo (zzjgdm,rc_type,name,xl,mobile,tel,fax,e_mail,"+ "card_type,card_no,zw,zc) values (#{zzjgdm},#{rc_type},#{name},#{xl},#{mobile},"+ "#{tel},#{fax},#{e_mail},#{card_type},#{card_no},#{zw},#{zc})";String sql2 = "insert into dec_finance_baseinfo (zzjgdm,xmlb,sn,qn,dqn,zzl_avg) values "+ "(#{zzjgdm},#{xmlb},#{sn},#{qn},#{dqn},#{zzl_avg})";String sql3 = "insert into dec_development_baseinfo (zzjgdm,xmmc,sn,qn,dqn,data_status,zzl_avg)"+ " values (#{zzjgdm},#{xmmc},#{sn},#{qn},#{dqn},#{data_status},#{zzl_avg})";String sql4 = "insert into dec_support_baseinfo (zzjgdm,seq,xmmc,zzbm,zzje,zzxs,zzsj,yssj,"+ "xmysqk,jkchqk,hksj) values (#{zzjgdm},#{seq},#{xmmc},#{zzbm},#{zzje},#{zzxs},"+ "#{zzsj},#{yssj},#{xmysqk},#{jkchqk},#{hksj})";String sql5 = "insert into dec_products_baseinfo (zzjgdm,seq,zycpmc,sfjyzscq,cplx,cpxxsrze,"+ "zqyxssrbl) values (#{zzjgdm},#{seq},#{zycpmc},#{sfjyzscq},#{cplx},#{cpxxsrze},"+ "#{zqyxssrbl})";// 分别执行事务ps = con.prepareStatement(sql);ps.executeUpdate();ps = con.prepareStatement(sql1);ps.executeUpdate();ps = con.prepareStatement(sql2);ps.executeUpdate();ps = con.prepareStatement(sql3);ps.executeUpdate();ps = con.prepareStatement(sql4);ps.executeUpdate();ps = con.prepareStatement(sql5);ps.executeUpdate();// 在try块内添加事务的提交操作,表示操作无异常,提交事务。con.commit();con.setAutoCommit(true);} catch (Exception ex) {try {con.rollback(); //操作失败则事务回滚} catch (Exception e) {e.printStackTrace();}ex.printStackTrace();} finally {//最后一定要关闭try {ps.close();con.close();} catch (Exception e) {e.printStackTrace();}}}
Spring的JDBC事务实现相关推荐
- Spring4.x()--Spring的Jdbc事务-零配置
Spring的Jdbc事务-零配置 一.拷贝必要的jar包到工程的lib目录 二.准备数据库表和实体类 创建数据库: create database spring; use spring; 创建表: ...
- Spring4.x()-Spring的Jdbc事务-注解
Spring的Jdbc事务-注解 一.拷贝必要的jar包到工程的lib目录 二.创建spring的配置文件并导入约束 <?xml version="1.0" encoding ...
- spring配置JDBC事务
http://www.iteye.com/problems/2951 Spring+JDBC事务配置 悬赏:10 发布时间:2008-08-19 提问人:charity_lan (初级程序员) < ...
- Spring4.x()--Jdbc事务-XML
Spring的Jdbc事务-XML 一.拷贝必要的jar包到工程的lib目录 二.创建spring的配置文件并导入约束 <?xml version="1.0" encodin ...
- spring 同时配置hibernate and jdbc 事务
http://blog.csdn.net/mypop/article/details/6120377 在项目中同时用到了JDBC和Hibernate,分别配置了各自的事务,同时配置了不同的tx:ann ...
- JDBC事务和JTA事务的区别 --包含spring事务 声明式事务
2019独角兽企业重金招聘Python工程师标准>>> 一.事务概述 事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,其中的操作要么全做要么全都不做. 与事务相关的操作主要 ...
- Spring 3.1 事务配置
版权声明:原创作品,谢绝转载!否则将追究法律责任. Spring 3.1 事务配置 spring发的包最好用的是2.5.6:所依赖的包全部都有,可是后来的版本都缺这少那的,导致开发中遇到各种各样的问题 ...
- Spring中的事务管理详解
在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...
- (转)使用Spring配置文件实现事务管理
http://blog.csdn.net/yerenyuan_pku/article/details/52886207 前面我们讲解了使用Spring注解方式来管理事务,现在我们就来学习使用Sprin ...
最新文章
- uiwebview 读取本地html,UIWebView加载本地HTML文件
- 甘肃黄土山地数十载现“满眼绿” 护林员四季不歇护植被
- 男人必看:最近在网上流传甚广的一个帖子
- Delphi (Library Path Browsing Path)
- springboot打Jar包和War包
- android弹幕开发,android弹幕框架
- javafx窗体程序_JavaFX实际应用程序:SkedPal
- 洛谷-P1160 队列安排
- TYVJ1467 通往聚会的道路
- CSS设置居屏幕中间的弹出块
- 48V转12V电源芯片,48V转15V降压芯片电路图方案
- oracle数据库书籍mobi,Oracle Database 12c PL/SQL开发指南(第7版) pdf epub mobi txt 下载...
- 接口工具POSTMAN怎么设置中文
- 【Unity】Unity5.0之PBR/PBS详解
- 设备台式计算机显示叹号,台式电脑出现叹号不能上网怎么办_台式机电脑出现感叹号不能上网的处理方法-系统城...
- 向Docker告别的时候到了
- EOJ 1864 二分图匹配
- 「卷无人道」,手机app定制
- saber软件安装后怎么打开_Saber2016安装包和安装详细安装步骤
- python 爬取歌曲程序_如何让程序像人一样的去批量下载歌曲?Python爬取付费歌曲...