在Spring中实现编程式的事务管理_第1页
在Spring中实现编程式的事务管理_第2页
在Spring中实现编程式的事务管理_第3页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在 Spring 中实现编程式的事务管理1、编程式的事务管理实现-传统的JDBC事务管理一般的数据源由容器进行管理,包括连接池。例如 容器都提供了这个功能。(2)JDBC标准的事务管理实现的代码Connection conn = null;tryconn = DBConnectionFactory.getConnection;conn.setAutoCommit( false );/(1)/ 完成对数据库的修改操作Updateupdateconn. commit();/(2)catch(Exception e)conn. rollback ();/do sthfinallytryconn.cl

2、ose();catch(SQLException se)/do sthTOMCAT WEBSPHEREWEBLOGI等这些 J2EE 商业缺省方式是自动提交自己提交/(3) 恢复修改1)对每个请求都是从数据源中重新取出一个连接以往使用JDBC进行数据操作时,一般采用DataSource,从数据源中得到 Connection,我们知道数据源DataSource 是线程安全的,而数据连接对象 Connection 不是线程安全的,所以对每个请求都是从数据源 中重新取出一个连接。(3)JDBC标准的事务管理实现的代码的缺点 按照以往的思路来写代码,不仅代码量比较长,而且也很容易疏忽或者忘掉一些try

3、/catch 语句,引发一些异常无法 catch ,因此,我们会写 DBTool 类,来关闭这些资源,并且保证在关闭这些资源时,不向 外抛异常。2、Spring JdbcTemplate的缺省的事务管理模式(1)Spring为我们对JDBC事务管理模式进行包装,从而在一定的程度上简化了编程 Spring 提供了几个关于事务处理的类:TransactionDefinition /事务属性定义TranscationStatus /代表了当前的事务,可以提交,回滚。PlatformTransactionManager这些类是 spring 提 供的用于 管理事务的基础接 口,其下 有一个实现的抽象类

4、 AbstractPlatformTransactionManager, 我们使用的事务管理类例如 DataSourceTransactionManager 等都 是这个类的子类。(2) JdbcTemplate的缺省的事务管理模式采用的是JDBC默认的AutoCommit模式前面的例中的JdbcTemplate操作采用的是 JDBC默认的AutoCommit模式,也就是说我们还无法保证 数据操作的原子性(要么全部生效,要么全部无效) 。如下面的操作:JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.u

5、pdate(UPDATE user SET age = 10 WHERE id = 1234); jdbcTemplate.update(UPDATE user SET age = age+1 WHERE id = 1234);由于采用了 AutoCommit 模式,第一个 update 操作完成之后被自动提交,数据库中 1234 对应的记录 已经被更新,如果第二个操作失败,我们无法使得整个事务回滚到最初状态。对于这个例子也许无关紧要,但是对于一个金融帐务系统而言,这样的问题将导致致命错误。为了实 现数据操作的原子性,我们需要在程序中引入事务逻辑。( 3)利用 DataSourceTransa

6、ctionManager 类实现代码控制的事务管理 类为 JDBC DataSource类型的数据源的事务管理组件。只需要在Bean的定义配置的*.xml文件中对它进行配置,然后将其引入到我们的DAC类中。( 4)使用 Spring 编程式的事务管理的基本流程声明数据源声 明 一 个 事 务 管 理 类 ,例 如DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等在我们的代码中加入事务处理代码( 5)代码示例如下:TransactionDefinition td = new Transact

7、ionDefinition();TransactionStatus status = transactionManager.getTransaction(td);tryJdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.update(UPDATE user SET age = 10 WHERE id = 1234); jdbcTemplate.update(UPDATE user SET age = age+1 WHERE id = 1234); transactionMmit(status);catch

8、(Exception e)transactionManager.rollback(status);在JBuilder中的本Project中实现Spring的代码控制的事务管理1问题:在本项目中再添加一个对用户信息进行修改的功能模块2、添加一个 updateUserl nfo.jspE即固餐卸汕小湍VC血SpjriikgWVCIebApp- jpx Project Stnirc* li *BX spring*ebapp 日 Sp ! S KFtajeel - SpringflVCWebA. .* 口 X,X护?. UEerLogi mAc tioiiEbEXi tX 9 SpriibdlVCWe

9、LriikgllVCleb? Deployment des( jfl Module directoiI- MloginFai logi nSuc regi ster F e gi s t er UEerLogi usrRegi毋“ nB-IHTr- ISl Rani 1 ft 1i c-n在该页面中添加一个表单虹b nodule SprinrfllOsb险n电:Generatw errr p色百eQ J5P Wizard - 5tep 1 of 4us&rLi n/ updat eUsrlnfoDeclue J5F aid ccunponeiit5T?Ch&ose th locati on a

10、nd 巩颐遂 of th电 JSF fil e and 晡hi ch optional components to create.ZupdateUserl nfo请输入用户名称:请输入用户密码:诸輸入用户名称:诸输入用户密码:r6789101112%G page contentType=rrtext/html; charset=GBKrT 轸寸 up d a VeUs e t InE obody bscolor-ffffff input type=r,subnit” 西丄开始修改、type=teset value=rr取消隆改3、修改我们的控制器程序,在其中增加下面的代码(黑体部分)packa

11、ge spri ngwebapp;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class UserLoginController extends SimpleFormController private UserLoginInterface userLoginImpleBean = null;public void setUserLoginImpleBean(UserLoginInterface newUserLoginImpleBean) u

12、serLoginImpleBean = newUserLoginImpleBean;public void setLoginFailure(String loginFailure) this.loginFailure = loginFailure;public void setLoginSuccess(String loginSuccess) this.loginSuccess = loginSuccess;public UserLoginInterface getUserLoginImpleBean() return userLoginImpleBean;public String getL

13、oginFailure() return loginFailure;public String getLoginSuccess() return loginSuccess;public UserLoginController() protected ModelAndView onSubmit(Object formBean) throws ExceptionUserLoginForm userLoginForm = (UserLoginForm) formBean; ModelAndView targetModelAndView = null;switch (Integer.parseInt(

14、userLoginForm.getMenuID() case 1: / 用户登录 targetModelAndView = doUserLogin(userLoginForm); break;case 2: / 用户注册 targetModelAndView = doUserRegister(userLoginForm); break;case 3: / 修改用户信息 targetModelAndView = doUpdateUserInfo(userLoginForm); break;return targetModelAndView;public ModelAndView doUpdate

15、UserInfo(UserLoginForm userLoginForm)String userName = userLoginForm.getUserName();String userPassWord = userLoginForm.getUserPassWord();UserInfoVO oneUserInfoVO = new UserInfoVO();oneUserInfoVO.setUserName(userName);oneUserInfoVO.setUserPassWord(userPassWord);boolean okOrNot = userLoginImpleBean.do

16、UpdateUserInfo(oneUserInfoVO);if (okOrNot)return new ModelAndView(this.getUpdateSuccess();elsereturn new ModelAndView(this.getUpdateFailure();public ModelAndView doUserRegister(UserLoginForm userLoginForm) = String registerTime = rightNow.toLocaleString();UserInfoVO userInfo = new UserInfoVO();userI

17、nfo.setUserName( userLoginForm.getUserName();userInfo.setUserPassWord(userLoginForm.getUserPassWord();userInfo.setUserDepartment( userLoginForm.getUserDepartment(); userInfo.setUserAdminLevel(Integer.parseInt(userLoginForm.getUserAdminLevel(); userInfo.setDepartAdminLevel(Integer.parseInt(userLoginF

18、orm.getUserAdminLevel(); userInfo.setUserImage(userLoginForm.getUserImage();userInfo.setRegisterTime(registerTime);boolean okOrNot = userLoginImpleBean.doUserRegister(userInfo);if (okOrNot) return new ModelAndView(registerSuccess); else return new ModelAndView(registerFailure);public ModelAndView do

19、UserLogin(UserLoginForm userLoginForm)String userName = userLoginForm.getUserName();String userPassWord = userLoginForm.getUserPassWord();UserInfoVO oneUserInfoVO = new UserInfoVO();oneUserInfoVO.setUserName(userName);oneUserInfoVO.setUserPassWord(userPassWord);boolean okOrNot = userLoginImpleBean.d

20、oUserLogin(oneUserInfoVO);if (okOrNot)return new ModelAndView(getLoginSuccess();elsereturn new ModelAndView(getLoginFailure();private String updateSuccess;private String updateFailure;public String getUpdateFailure() return updateFailure;public String getUpdateSuccess() return updateSuccess;public v

21、oid setUpdateSuccess(String updateSuccess) this.updateSuccess = updateSuccess;public void setUpdateFailure(String updateFailure) this.updateFailure = updateFailure;private String registerSuccess;private String registerFailure;public String getRegisterSuccess() return registerSuccess;public void setR

22、egisterSuccess(String registerSuccess) this.registerSuccess = registerSuccess;public String getRegisterFailure() return registerFailure;public void setRegisterFailure(String registerFailure) this.registerFailure = registerFailure;private String loginSuccess;private String loginFailure;4、修改我们的业务层组件(1

23、) 修改我们的业务接口以增加新的方法定义package springwebapp;public interface UserLoginInterface public abstract boolean doUserLogin(UserInfoVO oneUserInfo); public abstract boolean doUserRegister(UserInfoVO oneUserInfo);public abstract boolean doUpdateUserInfo(UserInfoVO oneUserInfo);Us *rLo gi nC on.tr oiler UzerLogi

24、nFcirni. java.暫 Us erLo gi nlmpl e. j avabbbssssSprinMVCWeb&-J. Deployment descriptModule directoryBuserLoginXi ngapp* s e rvl a t1X 创 upditsVstrlnfo|X .学 Us trnC tntr oil trXUserLogi nlmplepackajgpe sp r ingweb app;1yidalic interface UserLoginIn.terface public alnstract boolean daUserLogin(Userlnfo

25、VO oneUserlnfo);idilic abstract boolean doUserRegiStet(UserlnEoVO oneUseInto);public abstract boolean doUpdateUserlnfo(UserInfoVD oneUseilnfo);(2) 修改我们的业务实现类以增加对该方法的具体实现-修改用户的信息并采用事务来加以控制在该类中添加一个 transactionManager 属性,并且实现我们的带事务处理的方法-事务管理的控制最好应该放到商业逻辑层。我们可以设计一个处理商业逻辑的JavaBean,在该JavaBean中调用DAQ然后把实现商业

26、逻辑的 JavaBean的方法纳入Spring的事务管理。package spri ngwebapp;import org.spri ngframework.con text.Applicatio nListe ner; import org.spri ngframework.c on text.Applicatio nCon textAware;import org.spri ngframework.c on text.Applicatio nCon text; import org.spri ngframework.bea ns.Bea nsExceptio n;import org.sp

27、ri ngframework.tra nsact ion. support.DefaultTra nsacti on Defi niti on;import org.spri ngframework.tra nsactio n.Tra nsactio nStatus;import org.spri ngframework.tra nsactio n.PlatformTra nsactio nMan ager;public class UserLogi nlmple impleme nts UserLog inIn terface,Applicati onCon textAware Applic

28、atio nListe ner action Eve ntResp onse = n ull;public void setAct ionEven tResp on se(Applicati on Liste ner acti onEven tResp on se) this.actio nEven tResp onse = actio nEve ntResp on se;private JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) this.jdbcTemplate = jdb

29、cTemplate;private PlatformTra nsact ionMan ager tran sacti onMan ager;public void setTra nsact ionMan ager(PlatformTra nsact ionMan ager tran sact ionMan ager) this.tra nsacti onMan ager = tran sact ionMan ager;public UserLogi nl mple()public boolea n doUserRegister(Userl nfoVO userI nfo)return true

30、;public boolean doUpdateUserInfo(UserInfoVO oneUserInfo)String userName=oneUserInfo.getUserName();String userPassWord=oneUserInfo.getUserPassWord();Object parameter=userPassWord,userName;/ 我们需要事务定义,作为示例,我们采用 DefaultTransactionDefinitionDefaultTransactionDefinition def = new DefaultTransactionDefinit

31、ion();TransactionStatus status = transactionManager.getTransaction(def);String updateSQL1 = update userInfo set userPassWord = ? where userName =?;String updateSQL2 = update userInfo1 set userPassWord = ? where userName =?;try /*为了说明事务处理 , 我们对数据库表进行了两次修改, 其中第二次修改应该是失败的 (并注意到我們故 意在数据库表名称上写错,这使得 SQL句子

32、不合语法,因而造成DataAccessException(它圭寸裝了 SQLException ),这个异常被catch捕捉,因而执行rollback。取消前面的正确执行SQL的操作结果,如果沒有发生错误,则最后我们使用 commit() 来提交操作。*/catch (DataAccessException ex)transactionManager.rollback(status); /也可以执行 status.setRollbackOnly();throw ex;transactionMmit(status);return true;public boolean doUserLogin(U

33、serInfoVO oneUserInfo)boolean okOrNot=false;String userName=oneUserInfo.getUserName();String userPassWord=oneUserInfo.getUserPassWord();String sqlStatement=select * from UserInfo where userName=+userName+ and userPassWord =+userPassWord+;= jdbcTemplate.queryForList(sqlStatement);if (resultRows!=null

34、)&(resultRows.size() != 0) /现在已经对对数据库表的访问UserLoginActionEventuserLoginActionEvent=newUserLoginActionEvent(actionEventResponse); /注意指定事件的目标对象/触发事件okOrNot=true;elseokOrNot=false;return okOrNot;private Applicati onCon text applicati onCon text;publicvoidsetApplicati onCon text(Applicati onCon textappli

35、catio nCon text)throwsBea nsExcepti onthis.applicati onCon text = applicati onCon text;5、修改我们的*.xml配置文件(1) 在springapp-servlet.xml文件中添加下面的与事务相关的一些配置项目bea nid=tra nsact ionMan agerTjJJ spriitgapp-servlet | XSpriiigMVCWeb XupdateUserlnfo | XUeerLoginControiler X TA UserLoginlmple | XUEerLoginlnterfa1 P

36、iii|MsefirrexceptianHwping.3rrJtsy java sql. SQLEx cep ci onrr showDBE r ro r /prap:?7=java lang1 jMIMlIid= traiisactioiiMaiiagerc2dSiS=,org sprmt/txaiueworkdbc datasourct。&匸3倉口口工!:巴丁1:比1吕3匚匸10】111址130亡亡0i|0com, microsof t jdbu sqlserver 弓QLWei:射电:rDri/VE工Cfvalue(2) 修改我们的业务实现类的对象声明(3) 修改我们的控制层组件以增加下

37、面的属性 vproperty n ame=comma ndClassspri ngwebapp.UserLog inFo rm in dexuserLog in/updateUserI nfo userLog in/logi nSuccessuserLog in/logi nF ailureuserLog in/registerSuccess userLog in/registerFailure X l&leUser Info1XUstrLoeinController丨X *4 VserLceinlmoltX 匾I index;哼 sprin&wppsarvlat16 Pid=rruser L

38、oginContro ller,r cldss=rr apringwebapp Us er LoginCont-ro ller,r17 Wnane-,conantiCla3S,18spi:iii5webapplUserLoglnForiL1920 Pproperty 2i21U L_l3 0/ _narrupdQteSvicssrr2:4index2526弋7property de=rTupdateFai lur errX J valued us e t L o gin/up dateU3 e e In o / valueo Q(4) 对我们的 userloginController加以声明b

39、ea nid=urlMapp ingspri ngappC on trolleruserlogi nCon trolleruserlogi nCon trolleruserlogi nCon trollerXUserLozinActionEventJX f去 UeerLozinControilerX 上畫 UeerLozililntipleX 11 nserRXsprmgapp-servlet updateUserln61626 f ean id=urlllapping?f classorq spizzLngf 匚已m皂亡b .吕皂工vJL亡匕1181111皂工名imp丄亡U工丄Handle!

40、匸MappzLngW qm* ky= /hello dospringappContiollerus e r 1 o ginC ontr o 11 e ruse11 oginCon11: 11 etpivp tey-/updateUseElnfo dcTJusErloginGonBJJ+.迸山匚皿广上UEerNanneUEerPaEEffordue erD ep ar tmenthe erAdm i nLarldpsi工hm宓01234信息中心001234信息中心001234信息中心u0rhati 翠 31234信息中心00zhan 宰 41234信扈中心00工han疋51234信息中档00zK

41、ang261234信息中档00ndbninadmin信息中心10fdsEdsg-?99-?999-?99-799- r e w 1 rr*i rrr r00国鱼口亟亘点! 0竽夕1刘*医(2)执行本应用fa Proiect-5 0 Spri. nl;ar*1 1 !http; /focahust; 6080/Spr inWebAiserlogin .doProject | File Browser |Source View 毕仙 Vk-w 1 Wiet) View Soiree HistoryHI Mea&egesotg. springfraaetTork. jdbc.BadSqlGraBma

42、rEyceptiain: StateMentCalltoack; bad SQL cfranmar update userljava巴q丄 + SQLExu亡ptimn: MictosoEtSQLServer JDEC Drivet SQLServer对彖名U3e匚工nfcd,无效at couL.BLicrosof t. jat com .micrcinof t jdbc* 吕匸 Mn.TDmRtquu日 匸 octnnEiro 匚 Tok tn (Unknown Scucce)at con.iaicrosoEt. jdbc.sqlserver.tds.IDSRequest.pracessRe

43、plyToksnUrilcnoMi Source)(4) 同时在数据库表中的数据并没有被修改表43个厦目L控制台根目录H 匚0 Microsoft SQL Servers二 SQL ServerF 5) (kKal) (Window NT)二_|數据库+ 0 master* (J tnodel + 爾 msdb* J+爾 pubs* U tempdb.匚燼 WebStudyDS 垮关系圏二filelnfo| 圉 fileType1 goodFavortesInfoinvestment0kkirie NetShopObjectlnfo 罔 NetShopUserlnFo 1 NewUserIri

44、fo5 person1 ProgramerBBS I ProgramerEBSMember户尸户户户尸户户户户戶 EIHI- CTF_ UT! rrr* FTP fFb一 HF m= n. rrry rrr _nfl nT sfl rn 鬥2006-741 B-23IS02006-7-11 M:23:502O06741 M:23;502006-7-11 14:23:5020067-11 M:23:S02006-7-11 M:23:502006-7-11 14:23:502006*7*11 14:231502006-7-11 M:23;5Q2006-741 14:23:502006-7-11 14:23:50崙企:表血曰5巾冲的数JE fi:WebstudyDB . Iocair1国耳曲亟口况i !畋&汨和歆娠n%userNameus

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论