黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

事務(wù)管理

系統(tǒng) 2340 0
編程式的事務(wù)管理
另外,編程式事務(wù)提供了TransactionTemplate 模板類,該類可以大大減少事務(wù)操作的代碼。因此TransactionTemplate 采用Callback 避免讓開發(fā)者重復(fù)書寫其打開事務(wù)、提交事務(wù)及回滾事務(wù)等代碼,同時(shí)TransactionTemplate 無須書寫大量的try..catch 塊。
HibernateTemplate 必須提供PlatformTransactionManager 實(shí)例。該實(shí)例既可以在代碼中手動(dòng)設(shè)置,也可以使用Spring 的依賴注入。總之,只要獲取了PlatformTransactionManager 引用, TransactionTemplate 就可以完成事務(wù)操作。
使用TransactionTemplate 不需要顯式地開始事務(wù),甚至不需要顯式地提交事務(wù)。這些步驟都由模板完成。但出現(xiàn)異常時(shí),應(yīng)通過TransactionStatus 的setRollbackOnly 顯式回滾事務(wù)。
TransactionTemplate 的execute 方法接收一個(gè)TransactionCallback 實(shí)例。Callback 也是Spring 的經(jīng)典設(shè)計(jì),用于簡化用戶操作, TransactionCallback 包含如下方法。
? Object dolnTransaction(TransactionStatus status) 。
該方法的方法體就是事務(wù)的執(zhí)行體。
如果事務(wù)的執(zhí)行體沒有返回值,則可以使用TransactionCallbackWithoutResultl類的實(shí)例。這是個(gè)抽象類,不能直接實(shí)例化,只能用于創(chuàng)建匿名內(nèi)部類。它也是TransactionCallback 接口的子接口,該抽象類包含一個(gè)抽象方法:
? void dolnTransactionWithoutResult(TransactionStatus status)該方法與dolnTransaction 的效果非常相似,區(qū)別在于該方法沒有返回值,即事務(wù)執(zhí)行體無須返回值。
在下面的示例中, PlatformTransactionManager 實(shí)例采用適用于Hibernate 的事務(wù)管理器來實(shí)現(xiàn)類HibernateTransactionManager,該實(shí)現(xiàn)類是個(gè)局部事務(wù)管理器,容器中僅僅部署了該事務(wù)管理器bean ,因此應(yīng)在代碼中于動(dòng)為TransactionTemplate 注入事務(wù)管理器bean。下面是Hibernate 局部事務(wù)管理的配置文件的源代碼:?
<? 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 >
????????
<!-- 定義數(shù)據(jù)源,該bean?的ID?為dataSource-→
????????<bean?id="dataSource"?class="org.springfrarnework.jdbc.datasource.DriverManagerDataSource">
????????????<!--?指定數(shù)據(jù)庫驅(qū)動(dòng)
-->
????????????
< property? narne ="driverClassNarne" >< value > corn.rnysql.jdbc.Driver </ value ></ property >
????????????
<!-- ?指定連接數(shù)據(jù)庫的URL -->
????????????
< property? narne ="url" >< value > jdbc:rnysql://wonder:3306/j2ee </ value ></ property >
????????????
<!-- root?為數(shù)據(jù)庫的用戶名 -->
????????????
< property? name ="username" >< value > root </ value ></ property >
????????????
<!-- ?pass?為數(shù)據(jù)庫密碼 -->
????????????
< property? name ="password" >< value > pass </ value ></ property >
????????
</ bean >
????????
<!-- 定義Hibernate?的SessionFactory -->
????????
< bean? id ="sessionFactory" ?class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
????????????
<!-- 依賴注入數(shù)據(jù)源,注入上文定義的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 >
????????????????????
<! ?不同數(shù)據(jù)庫連接,啟動(dòng)時(shí)選擇create?,?update?,?create-drop-- >
????????????????????
< prop? key ="hibernate.hbm2ddl.auto" > update </ prop >
????????????????
</ props >
????????????
</ property >
????????
</ bean >
????????
<!-- 配置Hibernate?的事務(wù)管理器一〉
????????<!--使用HibernateTransactionManager類,該類是PlatformTransactionManager?接口針對采用Hibernate持久化連接的特定實(shí)現(xiàn)。
-->
????????
< bean? id ="transactionManager" ????????class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
????????
<!-- HibernateTransactionManager?bean?需要依賴注入一個(gè)SessionFactory?bean?的引用 -->
????????????
< property? name ="sessionFactory" >
????????????????
< ref? local ="sessionFactory" />
????????????
</ property >
????????
</ bean >
</ beans >

?

下面是采用TransactionTemplate和HibemateTemplate的事務(wù)操作代碼:

public ? class ?TransactionTest
... {
public ? static ? void ?main(String[]?args)
... {
????
// 因?yàn)椴⑽丛趙eb?應(yīng)用中測試,故需要手動(dòng)創(chuàng)建Spring?的上下文
???? final ?ApplicationContext?ctx? = ? new ?FileSystemXrnlApplicationContext( " bean.xml " );
????
// 獲得Spring?上下文的事務(wù)管理器
????PlatformTransactionManager?transactionManager = (PlatformTransactionManager)ctx.getBean( " transactionManager " );
????
final ?SessionFactory?sessionFactory? = ????(SessionFactory)ctx.getBean( " sessionFactory " );
????
// 以事務(wù)管理器實(shí)例為參數(shù),創(chuàng)建TransactionTemplate對象
????TransactionTemplate?tt? = ? new ?TransactionTemplate(transactionManager);
????
// 設(shè)置TransactionTemplate的事務(wù)傳播屬性
????tt.?setPropagationBehavior?(TransactionDefinition.PROPAGATION_REQUlRED);
????
// 執(zhí)行TransactionTemplate的execute方法,該方法需要TransactionCallback實(shí)例
????tt.execute( new ?TransactionCallbackWithoutResult()
????
// 采用TransactionCallbackWithoutResult匿名內(nèi)部類的形式執(zhí)行
????protectedvoid?dolnTransactionWithoutResult(TransactionStatus?ts)
????
try
????
... {
????????
// 以SessionFactory?實(shí)例為參數(shù)創(chuàng)建HibernateTemplate
????????HibernateTemplate?hibernateTemplate? =
????????
new ?HibernateTemplate(sessionFactory);
????????MyTestpl?
= 丑ew?MyTest?( " Jack " );
????????
// 保存第一個(gè)實(shí)例
????????hibernateTemplate.save(pl);
????????
// 讓下面的數(shù)據(jù)庫操作拋出異常即可看出事務(wù)效果。前面的操作也
????????
// 不會(huì)生效
????????MyTestp2? = ? new ?MyTest?( " Jack " );
????????
// 保存第二個(gè)實(shí)例,可將Person?的name?屬性設(shè)為標(biāo)識屬性,并
????????
// 引起主鍵重復(fù)的異常,可看出前一條記錄也不會(huì)加入數(shù)據(jù)庫中
????????hibernateTemplate.save(p2);
????}

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

????????}

????????}
);
????????}
????????}

事務(wù)管理


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論