事务管理

系统 2044 0
编程式的事务管理
另外,编程式事务提供了TransactionTemplate 模板类,该类可以大大减少事务操作的代码。因此TransactionTemplate 采用Callback 避免让开发者重复书写其打开事务、提交事务及回滚事务等代码,同时TransactionTemplate 无须书写大量的try..catch 块。
HibernateTemplate 必须提供PlatformTransactionManager 实例。该实例既可以在代码中手动设置,也可以使用Spring 的依赖注入。总之,只要获取了PlatformTransactionManager 引用, TransactionTemplate 就可以完成事务操作。
使用TransactionTemplate 不需要显式地开始事务,甚至不需要显式地提交事务。这些步骤都由模板完成。但出现异常时,应通过TransactionStatus 的setRollbackOnly 显式回滚事务。
TransactionTemplate 的execute 方法接收一个TransactionCallback 实例。Callback 也是Spring 的经典设计,用于简化用户操作, TransactionCallback 包含如下方法。
• Object dolnTransaction(TransactionStatus status) 。
该方法的方法体就是事务的执行体。
如果事务的执行体没有返回值,则可以使用TransactionCallbackWithoutResultl类的实例。这是个抽象类,不能直接实例化,只能用于创建匿名内部类。它也是TransactionCallback 接口的子接口,该抽象类包含一个抽象方法:
• void dolnTransactionWithoutResult(TransactionStatus status)该方法与dolnTransaction 的效果非常相似,区别在于该方法没有返回值,即事务执行体无须返回值。
在下面的示例中, PlatformTransactionManager 实例采用适用于Hibernate 的事务管理器来实现类HibernateTransactionManager,该实现类是个局部事务管理器,容器中仅仅部署了该事务管理器bean ,因此应在代码中于动为TransactionTemplate 注入事务管理器bean。下面是Hibernate 局部事务管理的配置文件的源代码: 
<? xml version="1.0" encoding="gb2312" ?>
<!  -- Spring 配置文件的DTD 定义-- >
<! DOCTYPE beans PUBL工C "-//SPRING//DTD BEAN//EN"
''http://www.springfrarnework.org/dtd/sp工rng-beans.dtd"
>
<!--  Spring 配置文件的根元素是beans -->
    
< beans >
        
<!-- 定义数据源,该bean 的ID 为dataSource-→
        <bean id="dataSource" class="org.springfrarnework.jdbc.datasource.DriverManagerDataSource">
            <!-- 指定数据库驱动
-->
            
< property  narne ="driverClassNarne" >< value > corn.rnysql.jdbc.Driver </ value ></ property >
            
<!--  指定连接数据库的URL -->
            
< property  narne ="url" >< value > jdbc:rnysql://wonder:3306/j2ee </ value ></ property >
            
<!-- root 为数据库的用户名 -->
            
< property  name ="username" >< value > root </ value ></ property >
            
<!--  pass 为数据库密码 -->
            
< property  name ="password" >< value > pass </ value ></ property >
        
</ bean >
        
<!-- 定义Hibernate 的SessionFactory -->
        
< bean  id ="sessionFactory"  class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
            
<!-- 依赖注入数据源,注入上文定义的dataSource -->
            
< property  name ="dataSource" >< ref  local ="dataSource" /></ property >
            
<!-- mappingResouces属性用来列出全部映射文件>
            <property name="mappingResources">
                <list>
                    <!--以下用来列出所有的PO 映射文件
-->
                    
< value > lee/MyTest.hbm.xml </ value >
                
</ list >
            
</ property >
        
<!-- 定义Hibernate 的SessionFactory的属性 -->     
            
< property  name ="hibernateProperties" >
                
< props >
                    
<!--  指定Hibernate 的连接方法 -->
                    
< prop  key ="hibernate.dialect" > org.hibernate.dialect.MySQLDialect </ prop >
                    
<!  不同数据库连接,启动时选择create , update , create-drop-- >
                    
< prop  key ="hibernate.hbm2ddl.auto" > update </ prop >
                
</ props >
            
</ property >
        
</ bean >
        
<!-- 配置Hibernate 的事务管理器一〉
        <!--使用HibernateTransactionManager类,该类是PlatformTransactionManager 接口针对采用Hibernate持久化连接的特定实现。
-->
        
< bean  id ="transactionManager"         class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
        
<!-- HibernateTransactionManager bean 需要依赖注入一个SessionFactory bean 的引用 -->
            
< property  name ="sessionFactory" >
                
< ref  local ="sessionFactory" />
            
</ property >
        
</ bean >
</ beans >

 

下面是采用TransactionTemplate和HibemateTemplate的事务操作代码:

public   class  TransactionTest
... {
public   static   void  main(String[] args)
... {
    
// 因为并未在web 应用中测试,故需要手动创建Spring 的上下文
     final  ApplicationContext ctx  =   new  FileSystemXrnlApplicationContext( " bean.xml " );
    
// 获得Spring 上下文的事务管理器
    PlatformTransactionManager transactionManager = (PlatformTransactionManager)ctx.getBean( " transactionManager " );
    
final  SessionFactory sessionFactory  =     (SessionFactory)ctx.getBean( " sessionFactory " );
    
// 以事务管理器实例为参数,创建TransactionTemplate对象
    TransactionTemplate tt  =   new  TransactionTemplate(transactionManager);
    
// 设置TransactionTemplate的事务传播属性
    tt. setPropagationBehavior (TransactionDefinition.PROPAGATION_REQUlRED);
    
// 执行TransactionTemplate的execute方法,该方法需要TransactionCallback实例
    tt.execute( new  TransactionCallbackWithoutResult()
    
// 采用TransactionCallbackWithoutResult匿名内部类的形式执行
    protectedvoid dolnTransactionWithoutResult(TransactionStatus ts)
    
try
    
... {
        
// 以SessionFactory 实例为参数创建HibernateTemplate
        HibernateTemplate hibernateTemplate  =
        
new  HibernateTemplate(sessionFactory);
        MyTestpl 
= 丑ew MyTest ( " Jack " );
        
// 保存第一个实例
        hibernateTemplate.save(pl);
        
// 让下面的数据库操作抛出异常即可看出事务效果。前面的操作也
        
// 不会生效
        MyTestp2  =   new  MyTest ( " Jack " );
        
// 保存第二个实例,可将Person 的name 属性设为标识属性,并
        
// 引起主键重复的异常,可看出前一条记录也不会加入数据库中
        hibernateTemplate.save(p2);
    }

    
catch  (Exception e)
    
... {
        ts.setRollbackOnly();
        }

        }

        }
);
        }
        }

事务管理


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论