JavaEE企业级项目开发(第3版)课件 微课6-3:编程式事务_第1页
JavaEE企业级项目开发(第3版)课件 微课6-3:编程式事务_第2页
JavaEE企业级项目开发(第3版)课件 微课6-3:编程式事务_第3页
JavaEE企业级项目开发(第3版)课件 微课6-3:编程式事务_第4页
JavaEE企业级项目开发(第3版)课件 微课6-3:编程式事务_第5页
已阅读5页,还剩18页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

主讲人:石云延迟符编程式事务Spring的数据库开发与事务Spring事务简介

事务管理对于企业应用而言至关重要。它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性。Spring事务简介

Spring中提供了丰富的事务管理功能,它们超过了EJB并且和EJB一样支持声明式事务,重要的是Spring提供了一致的事务管理,它有如下优点。为不同的事务的API提供一致的编程模式;提供更简单,更易使用的编程式事务管理;支持Spring声明事务;整合Spring对数据访问的抽象。Spring事务简介在Spring中,事务是通过TransactionDefinition接口来定义的。该接口包含与事务属性有关的方法。TransactionDefinition接口中定义的主要方法如下所示。publicinterfaceTransactionDefinition{intgetPropagationBehavior();intgetIsolationLevel();intgetTimeout();booleanisReadOnly();}

Spring事务简介传播行为传播行为定义了事务应用于方法上之边界(Boundaries),它告知何时该开始一个新的事务,或何时事务该被暂停,或方法是否要在事务中进行。Spring事务简介传播行为Spring定义了几个传播行为,常用的传播行为如下所示。PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务;PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行;PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常;PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

Spring事务简介隔离级别在一个应用程序中,可能有多个事务同时进行,由于事务彼此独立,若读取的是同一个数据,容易发生问题。根据需求的不同,

隔离级别可以根据实际需求,对数据的锁定进行设置。Spring事务简介隔离级别Spring提供了几种隔离级别设置,如下所示。ISOLATION_DEFAULT:这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻读。ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。

Spring事务简介事务超时所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在TransactionDefinition中以int的值来表示超时时间,其单位是秒。Spring事务简介事务的只读属性事务的只读属性是指,对事务性资源进行只读操作或者是读写操作。所谓事务性资源就是指那些被事务管理的资源,比如数据源、JMS资源,以及自定义的事务性资源等等。编程式事务Spring提供的事务管理API,可以在代码中灵活控制事务的执行。在底层,Spring仍然将事务操作委托给底层的持久化框架来执行。Spring提供两种方式的编程式事务管理:使用TransactionTemplate和PlatformTransactionManager。编程式事务TransactionTempale采用和其他Spring模板,如JdbcTempalte和HibernateTemplate一样的方法。它使用回调方法,把应用程序从处理取得和释放资源中解脱出来。必须在事务上下文中执行的应用代码看起来像这样,注意使用TransactionCallback可以返回一个值,代码如下:jdbcTemplate.execute("CREATE

TABLE

USER

(user_id

integer,

name

varchar(100)");

Objectresult=tt.execute(newTransactionCallback(){publicObjectdoInTransaction(TransactionStatusstatus){updateOperation1();returnresultOfUpdateOperation2();}});编程式事务TransactionTempale如果没有返回值,使用TransactionCallbackWithoutResult,

代码如下:tt.execute(newTransactionCallbackWithoutResult(){protectedvoiddoInTransactionWithoutResult(TransactionStatusstatus){updateOperation1();updateOperation2();}});编程式事务使用PlatformTransactionManager

可以使用

org.springframework.transaction.PlatformTransactionManager直接管理事务。简单地通过一个bean引用给你的bean传递一个PlatformTransactionManager实现。然后,使用TransactionDefinition和TransactionStatus对象就可以发起事务,回滚和提交。jdbcTemplate.execute("CREATE

TABLE

USER

(user_id

integer,

name

varchar(100)");

DefaultTransactionDefinitiondef=newDefaultTransactionDefinition()def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);TransactionStatusstatus=transactionManager.getTransactionDefinition(def);try{//executeyourbusinesslogichere}catch(MyExceptionex){transactionManager.rollback(status);throwex;}transactionMmit(status);编程式事务【例6-1】编程式事务实例分析。主要步骤:创建用户类;创建数据库访问业务类;创建测试类;创建配置文件。编程式事务【例6-1】编程式事务实例分析。步骤1:创建用户类@DatapublicclassUser{privateStringname;privateStringpassword;privateIntegerage;}编程式事务【例6-1】编程式事务实例分析。步骤2:创建数据库访问业务类publicclassUserDao{privateDataSourcedataSource;privateJdbcTemplatetemplate;publicDataSourcegetDataSource(){returndataSource;}publicvoidsetDataSource(DataSourcedataSource){this.dataSource=dataSource;template=newJdbcTemplate(dataSource);transactionManager=newDataSourceTransactionManager(dataSource);def=newDefaultTransactionDefinition();//异常处理机制def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);}

编程式事务【例6-1】编程式事务实例分析。步骤2:创建数据库访问业务类publicvoidinsert(Useruser){//添加用户Stringname=user.getName();intage=user.getAge().intValue();TransactionStatusstatus=transactionManager.getTransaction(def);try{//下面的SQL有错误,用于测试事务template.update("INSERINTOtb_user2(name,age)"+"VALUES('"+name+"',"+age+")");}catch(DataAccessExceptione){transactionManager.rollback(status);//回滚到status这个状态System.out.println("执行回滚操作了!");throwe;}transactionMmit(status);System.out.println("成功提交了!");}}

编程式事务【例6-1】编程式事务实例分析。步骤3:创建测试类publicclassTestTransaction{publicstaticvoidmain(String[]args){//加载配置文件ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");//获取UserDao实例UserDaodao=(UserDao)applicationContext.getBean("userDao");Useruser=newUser();user.setName("cf");user.setPassword("123");user.setAge(1);dao.insert(user);}}

编程式事务【例6-1】编程式事务实例分析。步骤4:创建配置文件<context:property-placeholderlocation="classpath:perties"/> <!--配置数据源--><beanid="dataSource"class="mons.dbcp2.BasicDataSource"> <propertyname="driverClassName"value="${db.driver}"/> <propertyname="url"value="${db.url}"/> <propertyname="username"value="${db.username}"/> <propertyname="password"value="${db.password}"/> <propertyname="maxIdle"value="5"/> </bean>编程式事务【例6-1】编程式事务实例分析。步骤4:创

温馨提示

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

评论

0/150

提交评论