Java学习-编程式的事务管理

Java学习-编程式的事务管理

编程式事务提供了TransactionTemplate模板类,该类可以大大减少事务操作的代码。因此TransactionTemplate采用Callback避免让开发者重复书写其打开事务、提交事务及回滚事务等代码,同时TransactionTemplate无须书写大量的try..catch块。

HibernateTemplate必须提供PlatformTransactionManager实例。该实例既可以在代码中手动设置,也可以使用Spring的依赖注入。总之,只要获取了PlatformTransactionManager引用,TransactionTemplate就可以完成事务操作。

使用TransactionTemplate不需要显式地开始事务,甚至不需要显式地提交事务。这些步骤都由模板完成。但出现异常时,应通过TransactionStatus的setRollbackOnly显式回滚事务。

TransactionTemplate的execute方法接收一个TransactionCallback实例。Callback也是Spring的经典设计,用于简化用户操作,下面兄弟连www.lampbrother.net就帮大家总结了一些TransactionCallback包含的方法:如下。

•ObjectdolnTransaction(TransactionStatusstatus)。

该方法的方法体就是事务的执行体。

如果事务的执行体没有返回值,则可以使用TransactionCallbackWithoutResultl类的实例。这是个抽象类,不能直接实例化,只能用于创建匿名内部类。它也是TransactionCallback接口的子接口,该抽象类包含一个抽象方法:

•voiddolnTransactionWithoutResult(TransactionStatusstatus)该方法与dolnTransaction的效果非常相似,区别在于该方法没有返回值,即事务执行体无须返回值。

在下面的示例中,PlatformTransactionManager实例采用适用于Hibernate的事务管理器来实现类HibernateTransactionManager,该实现类是个局部事务管理器,容器中仅仅部署了该事务管理器bean,因此应在代码中于动为TransactionTemplate注入事务管理器bean。下面是Hibernate局部事务管理的配置文件的源代码:

<?xmlversion="1.0"encoding="gb2312"?>

<!--Spring配置文件的DTD定义-->

<!DOCTYPEbeansPUBL工C"-//SPRING//DTDBEAN//EN"

''http://www.springfrarnework.org/dtd/sp工rng-beans.dtd">

<!--Spring配置文件的根元素是beans-->

<beans>

<!--定义数据源,该bean的ID为dataSource-→

<beanid="dataSource"class="org.springfrarnework.jdbc.datasource.DriverManagerDataSource">

<!--指定数据库驱动-->

<propertynarne="driverClassNarne"><value>corn.rnysql.jdbc.Driver</value></property>

<!--指定连接数据库的URL-->

<propertynarne="url"><value>jdbc:rnysql://wonder:3306/j2ee</value></property>

<!--root为数据库的用户名-->

<propertyname="username"><value>root</value></property>

<!--pass为数据库密码-->

<propertyname="password"><value>pass</value></property>

</bean>

<!--定义Hibernate的SessionFactory-->

<beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<!--依赖注入数据源,注入上文定义的dataSource-->

<propertyname="dataSource"><reflocal="dataSource"/></property>

<!--mappingResouces属性用来列出全部映射文件>

<propertyname="mappingResources">

<list>

<!--以下用来列出所有的PO映射文件-->

<value>lee/MyTest.hbm.xml</value>

</list>

</property>

<!--定义Hibernate的SessionFactory的属性-->

<propertyname="hibernateProperties">

<props>

<!--指定Hibernate的连接方法-->

<propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

<!不同数据库连接,启动时选择create,update,create-drop-->

<propkey="hibernate.hbm2ddl.auto">update</prop>

</props>

</property>

</bean>

<!--配置Hibernate的事务管理器一〉

<!--使用HibernateTransactionManager类,该类是PlatformTransactionManager接口针对采用Hibernate持久化连接的特定实现。-->

<beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<!--HibernateTransactionManagerbean需要依赖注入一个SessionFactorybean的引用-->

<propertyname="sessionFactory">

<reflocal="sessionFactory"/>

</property>

</bean>

</beans>

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

publicclassTransactionTest

{

publicstaticvoidmain(String[]args)

{

//因为并未在web应用中测试,故需要手动创建Spring的上下文

finalApplicationContextctx=newFileSystemXrnlApplicationContext("bean.xml");

//获得Spring上下文的事务管理器

PlatformTransactionManagertransactionManager=(PlatformTransactionManager)ctx.getBean("transactionManager");

finalSessionFactorysessionFactory=(SessionFactory)ctx.getBean("sessionFactory");

//以事务管理器实例为参数,创建TransactionTemplate对象

TransactionTemplatett=newTransactionTemplate(transactionManager);

//设置TransactionTemplate的事务传播属性

tt.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUlRED);

//执行TransactionTemplate的execute方法,该方法需要TransactionCallback实例

tt.execute(newTransactionCallbackWithoutResult()

//采用TransactionCallbackWithoutResult匿名内部类的形式执行

protectedvoiddolnTransactionWithoutResult(TransactionStatusts)

try

{

//以SessionFactory实例为参数创建HibernateTemplate

HibernateTemplatehibernateTemplate=

newHibernateTemplate(sessionFactory);

MyTestpl=丑ewMyTest("Jack");

//保存第一个实例

hibernateTemplate.save(pl);

//让下面的数据库操作抛出异常即可看出事务效果。前面的操作也

//不会生效

MyTestp2=newMyTest("Jack");

//保存第二个实例,可将Person的name属性设为标识属性,并

//引起主键重复的异常,可看出前一条记录也不会加入数据库中

hibernateTemplate.save(p2);

}

catch(Exceptione)

{

ts.setRollbackOnly();

}

}

});

}

}

相关推荐