日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
分析數(shù)據(jù)庫事務(wù)循環(huán)依賴的影響與解決方法(數(shù)據(jù)庫事務(wù)循環(huán)依賴)

在數(shù)據(jù)庫中,事務(wù)是一組必須被一起執(zhí)行的數(shù)據(jù)庫操作。它們被視為一個(gè)單一的工作單元,要么全部成功,要么全部失敗。事務(wù)循環(huán)依賴是指兩個(gè)或多個(gè)事務(wù)互相依賴,并且被設(shè)計(jì)成必須在相互之間執(zhí)行。當(dāng)存在事務(wù)循環(huán)依賴時(shí),會(huì)出現(xiàn)難以解決的問題,影響數(shù)據(jù)庫的性能和穩(wěn)定性。本文將分析數(shù)據(jù)庫事務(wù)循環(huán)依賴的影響以及解決方法。

霍城網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

1. 事務(wù)循環(huán)依賴的影響

1.1 數(shù)據(jù)庫性能受到影響

事務(wù)循環(huán)依賴可能導(dǎo)致數(shù)據(jù)的更新和讀取之間的沖突,導(dǎo)致數(shù)據(jù)庫性能下降。循環(huán)依賴會(huì)阻止事務(wù)完成并釋放數(shù)據(jù)庫鎖,這可能導(dǎo)致其他事務(wù)在等待時(shí)間內(nèi)堵塞。

1.2 數(shù)據(jù)庫安全性受到威脅

事務(wù)循環(huán)依賴可能導(dǎo)致數(shù)據(jù)丟失和數(shù)據(jù)不完整的風(fēng)險(xiǎn)。由于互相依賴的事務(wù)的順序無法保證,如果一個(gè)事務(wù)的失敗導(dǎo)致系統(tǒng)中的其他事務(wù)一起失敗,數(shù)據(jù)就會(huì)處于不一致的狀態(tài)。

1.3 可維護(hù)性變差

事務(wù)循環(huán)依賴要求開發(fā)人員具有更高的技能,難以預(yù)測故障和維護(hù)代碼。當(dāng)軟件代碼中包含循環(huán)依賴關(guān)系時(shí),團(tuán)隊(duì)在修復(fù)一個(gè)錯(cuò)誤時(shí)可能會(huì)意外地影響到其他模塊的功能,所以在日常維護(hù)中是難以實(shí)現(xiàn)的。

2. 解決數(shù)據(jù)庫事務(wù)循環(huán)依賴的方法

2.1 分析依賴關(guān)系

在事務(wù)中如果存在循環(huán)依賴關(guān)系,必須首先找到每個(gè)循環(huán)并確定在哪個(gè)事務(wù)中出現(xiàn)問題。通過仔細(xì)調(diào)查依賴關(guān)系,可以找到數(shù)據(jù)庫變化的原因,從而將這些問題逐一解決。

2.2 優(yōu)化事務(wù)流程

優(yōu)化事務(wù)流程是避免事務(wù)循環(huán)依賴的更好方法之一。事務(wù)流程可以通過優(yōu)化數(shù)據(jù)查詢,避免重復(fù)查詢或在單個(gè)事務(wù)中完成多個(gè)查詢等方式進(jìn)行優(yōu)化。這將大大減少循環(huán)依賴的危險(xiǎn)性。

2.3 采用分布式事務(wù)處理

分布式事務(wù)處理是一種以分散數(shù)據(jù)庫事務(wù)負(fù)載為中心的解決方案。它包含一個(gè)處理請求的主服務(wù)器及數(shù)個(gè)工作服務(wù)器,將數(shù)據(jù)分片分散到不同的服務(wù)器上,分散事務(wù)負(fù)載。這種方案能夠有效減輕事務(wù)循環(huán)依賴時(shí)可能出現(xiàn)的鎖等因素,但是也增加了管理的復(fù)雜性,需要考慮跨服務(wù)器的通訊等問題。

2.4 數(shù)據(jù)庫重構(gòu)

重構(gòu)是一種在不影響現(xiàn)有功能的情況下從根本上修改應(yīng)用程序的方式。這種方法可以解決一個(gè)系統(tǒng)中設(shè)計(jì)不合理的問題。當(dāng)應(yīng)用程序中存在循環(huán)依賴時(shí),數(shù)據(jù)庫重構(gòu)是解決方法之一。重構(gòu)可能涉及調(diào)整數(shù)據(jù)模型,修改表結(jié)構(gòu)等等方面,需要謹(jǐn)慎考慮。

3.

事務(wù)循環(huán)依賴的問題可能嚴(yán)重影響數(shù)據(jù)庫的性能和穩(wěn)定性,并引起數(shù)據(jù)丟失等情況。本文提供了一些解決方案,包括分析依賴關(guān)系,優(yōu)化事務(wù)流程,采用分布式處理事務(wù)等。重構(gòu)是解決問題的最后手段,但需要謹(jǐn)慎考慮。因此,在數(shù)據(jù)庫設(shè)計(jì)和開發(fā)時(shí)應(yīng)該務(wù)必避免循環(huán)依賴的問題。

相關(guān)問題拓展閱讀:

  • 一篇讓你學(xué)會(huì) 11個(gè)Spring 失效場景
  • 如何運(yùn)用物理識(shí)圖,邏輯識(shí)圖進(jìn)行軟件架構(gòu)設(shè)計(jì)

一篇讓你學(xué)會(huì) 11個(gè)Spring 失效場景

其實(shí)關(guān)于spring事務(wù)失效的場景,網(wǎng)絡(luò)上文章介紹的不少,參差不齊。這里只分享下自己的見解,時(shí)長大概10分鐘左右,先上個(gè)圖介紹下。

事務(wù)方法需要定義public,非public方法事務(wù)會(huì)失效。事務(wù)攔截器TransactionalInterceptor會(huì)在執(zhí)行方法前進(jìn)行攔截,通過動(dòng)態(tài)代理方式如果是cglib就是intercept方法或者jdk的invoke方法間接調(diào)用AbstractFallbackTransactionAttributeSource類的getTransactionAttribute方法獲取配置信息,附上源碼圖:

進(jìn)一步的跟蹤getTransactionAttribute方法,我們就能看到,spring對于非public修飾的方式,返回的事務(wù)對象是null,其中allowPublicMethodsOnly返回的是一個(gè)布爾false。

事務(wù)底層使用了aop,那么也就是說通過jdk或者是cglib生成代理類,在代理類中實(shí)現(xiàn)的事務(wù)的功能,如果說方法是final修飾的了,那么就會(huì)導(dǎo)致代理類中無法重寫該方法,從而導(dǎo)致添加事務(wù)失敗。同樣的如果是static的修飾的話也是無法通過動(dòng)態(tài)代理變成事務(wù)方法。

簡單來說就是一個(gè)方法內(nèi)部調(diào)用另一個(gè)方法,但是另一個(gè)方式是有事務(wù)的,這樣也會(huì)導(dǎo)致事務(wù)失效,因?yàn)檫@個(gè)調(diào)用的是this對象的方法,而不是另一個(gè)方法持有的對象,可以這里理解。

如果想要在枯禪方法內(nèi)部調(diào)用另一個(gè)方法也有事務(wù)的話,就需要新建一個(gè)service對象持有。

這樣,通過新建一個(gè)service方法,將事務(wù)添加到新建的service方法里就可以了。說到這里可能小伙伴覺得這樣有點(diǎn)麻煩,那么是否有沒有其他的方式不新建一個(gè)方法呢,答案是可以的,就是注入自己,利用了spring ioc內(nèi)部的三級緩存的機(jī)制,這里注入自己就很好的保證了也不會(huì)出現(xiàn)循環(huán)依賴:

其實(shí)到了這一步,還是發(fā)現(xiàn)有點(diǎn)不太雅觀,并不是說上面代碼有什么問題只是覺得,可以讓上面代碼更加好看一點(diǎn),那么有沒有呢,答案是有的,是什么呢?這就不得不佩服spring強(qiáng)大完善的支持,那就是AopContext.currentProxy(),這個(gè)就是創(chuàng)建代理類,在方法調(diào)·調(diào)用前后切入,這個(gè)代理類對象是保存在ThreadLocal中的,所以通過這個(gè)代理類對象調(diào)用事務(wù)方法就能生效了。

這樣看來,代碼是不是就優(yōu)雅多了,哈哈!!!

這里需要明確一個(gè)前提,就是使用spring事務(wù)的前提,就是對象要被spring管理握啟就需要?jiǎng)?chuàng)建bean實(shí)例,在開發(fā)中,我們都是通過@Controller,@Service,@Component,@Repository等注解自動(dòng)的實(shí)現(xiàn)依賴注入實(shí)例化的功能,但假如說在相應(yīng)的控制層,業(yè)務(wù)層,數(shù)據(jù)層忘記加相應(yīng)的注解,那么也是會(huì)失效的。因?yàn)闆]有交給spring管理,例如:

回沒皮塵想起前幾年配置事務(wù)管理器時(shí),都會(huì)有這樣的一段配置:

通過這一段配置也可以知道,其實(shí)spring事務(wù)就是通過數(shù)據(jù)庫連接事務(wù)多線程連接會(huì)導(dǎo)致持有的connetion不是同一個(gè),從網(wǎng)上找了一張圖,通過這張圖進(jìn)一步理解:

接著附上偽代碼結(jié)合上面的圖進(jìn)一步理解:

事務(wù)add方法中調(diào)用了另一個(gè)事務(wù)doOtherThing,但是事務(wù)方法是在另一個(gè)線程中調(diào)用的,這樣就會(huì)導(dǎo)致兩個(gè)方法不在同一個(gè)線程中,獲取到的數(shù)據(jù)庫鏈接不一樣,是兩個(gè)不同的事務(wù),一旦doOtherThing發(fā)生異常,add方法也是不可能發(fā)生回滾的.這里需要解釋以下什么是同一個(gè)事務(wù),也就是說只有擁有同一個(gè)數(shù)據(jù)庫連接才能同時(shí)提交和回滾。如果在不同的線程,拿到的數(shù)據(jù)庫連接肯定是不一樣的,所以是不同的事務(wù)。

這個(gè)就沒什么好講的了,也就是innodb和myisam引擎的不同,5版本以前默認(rèn)是myisam引擎,這個(gè)引擎是不支持事務(wù)的,5版本以后的innodb是支持事務(wù)的。

這個(gè)其實(shí)可能也是比較容易忽略的,因?yàn)槲覀冇∠罄锖孟駴]怎么配置過怎么開啟事務(wù),也確實(shí)是這樣哈,為什么?其實(shí)原因很簡單,springboot項(xiàng)目通過DataSourceTransactionManagerAutoConfiguration這個(gè)類已經(jīng)默默的為我們開啟了事務(wù)。

這個(gè)類會(huì)加載spring.datasource這個(gè)配置文件從而啟動(dòng)事務(wù),如果是非springboot項(xiàng)目就需要自己手動(dòng)在xml文件中配置事務(wù)管理器。

類似這樣的從而開啟事務(wù)。

在使用@Transactional注解時(shí),是可以指定propagation參數(shù)的,該參數(shù)是用來指定事務(wù)的傳播特性,其中只有required,requires_new,nested這三種才會(huì)創(chuàng)建新事務(wù):

像上面的Propagation.NEVER這種類型的傳播特性不支持事務(wù),如果有事務(wù)則會(huì)拋異常。

像這種手動(dòng)try…catch了異常,又沒有手動(dòng)拋出,那么sring就會(huì)認(rèn)為程序是異常的就不會(huì)回滾了。

捕獲了異常又拋出了exception異常,事務(wù)同樣不會(huì)回滾,因?yàn)閟pring事務(wù)默認(rèn)情況下只會(huì)回滾RuntimeException(運(yùn)行時(shí)異常)和Error(錯(cuò)誤),對于普通的Exception(非運(yùn)行時(shí)異常),不會(huì)回滾,網(wǎng)上找了一張圖:

這里exception里除了分為運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常(ioException)。

1) 讓checked例外也回滾:

在整個(gè)方法前加上 @Transactional(rollbackFor=Exception.class)

2) 讓unchecked例外不回滾:

@Transactional(notRollbackFor=RunTimeException.class)

3)不需要事務(wù)管理的(只查詢的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

這里需要提及的一句是,如果是自定義了的異常,比如說我自定義了DALException異常,那么就應(yīng)該是@Transactional(notRollbackFor=DALException.class),一旦拋出的異常不屬于DALException異常,那么事務(wù)也是不會(huì)生效的。

其實(shí)這個(gè)就有點(diǎn)像是js里的冒泡事件,可能我只是需要底部,結(jié)果外層窗口事件也觸發(fā)了,聯(lián)想到事務(wù)這里,那么也是一樣的,嵌套多個(gè)可能只是想回滾對應(yīng)的事務(wù),就不用把其他事務(wù)也回滾了,這個(gè)可以通過try…catch來處理,將需要處理回滾的事務(wù)放這里面就不會(huì)把外層的也會(huì)滾了。

如何運(yùn)用物理識(shí)圖,邏輯識(shí)圖進(jìn)行軟件架構(gòu)設(shè)計(jì)

軟件架構(gòu)設(shè)計(jì)的目的

對于外包業(yè)務(wù)類型的項(xiàng)目,軟件架構(gòu)設(shè)計(jì)的目的與產(chǎn)品類型的項(xiàng)目有所不同,在這里主要討論外包類型項(xiàng)目的軟件架構(gòu)設(shè)計(jì)目的。

1、為大規(guī)模開發(fā)提供基礎(chǔ)和規(guī)范,并提供可重用的資產(chǎn),軟件系統(tǒng)的大規(guī)模開發(fā),必須要有一定的基礎(chǔ)和遵循一定的規(guī)范,這既是軟件工程本身的要求,也是客戶的要求。架構(gòu)設(shè)計(jì)的過程中可以將一些公共部分抽象提取出來,形成公共類和工具類,以達(dá)到重用的目的。

2、一定程度上縮短項(xiàng)目的周期,利用軟件架構(gòu)提供的框架或重用組件,縮短項(xiàng)目開發(fā)的周期。

3、降低開發(fā)和維護(hù)的成本,大量的重用和抽象,可以提取出一些開發(fā)人員不用關(guān)心的公共部分,這樣便可以使開發(fā)人員僅僅關(guān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn),從而減少了很多工作量,提高了開發(fā)效率。

4、提高產(chǎn)品的質(zhì)量,好的軟件架構(gòu)設(shè)計(jì)是產(chǎn)品質(zhì)量的保證,特別是對于客戶常常提出的非功能性需求的滿足。

軟件架構(gòu)設(shè)計(jì)的原則

軟件架構(gòu)設(shè)計(jì)必須遵循以下原則:

1、滿足功能性需求和非功能需求。這是一個(gè)喊做軟件系統(tǒng)最基本的要求,也是架構(gòu)設(shè)計(jì)時(shí)應(yīng)該遵循的最基本的原則。念汪

2、實(shí)用性原則,就像每一個(gè)軟件系統(tǒng)交付給用戶使用時(shí)必須實(shí)用,能解決用戶的問題一樣,架構(gòu)設(shè)計(jì)也必須實(shí)用,否則就會(huì)“高來高去”或“過度設(shè)計(jì)”。

3、滿足復(fù)用的要求,更大程度的提高開發(fā)人員的工作效率。

軟件架構(gòu)設(shè)計(jì)的幾種視圖

我們常常在討論架構(gòu)設(shè)計(jì)該做些什么的時(shí)候,或是在架構(gòu)設(shè)計(jì)評審的會(huì)議上,會(huì)提出各種各樣的問題,例如開發(fā)人員該如何記錄鄭高衡Log,事務(wù)如何控制?怎樣才能提高我們的開發(fā)人員的工作效率,即在單位時(shí)間內(nèi)更有品質(zhì)的完成更多的功能?怎樣滿足客戶的非功能性需求?怎樣讓生產(chǎn)環(huán)境的平臺(tái)管理人員更好的維護(hù)系統(tǒng)?

上面這些問題,實(shí)際上是軟件系統(tǒng)的不同的干系人站在不同的角度上提出的問題,要回答上面這些問題,我們就得從不同的視角來看待軟件架構(gòu)設(shè)計(jì)這項(xiàng)工作。

1、邏輯架構(gòu)視角,從系統(tǒng)用戶的角度考慮問題,設(shè)計(jì)出來的軟件架構(gòu)能夠滿足業(yè)務(wù)邏輯的需求,能夠處理現(xiàn)在越來越復(fù)雜的業(yè)務(wù)邏輯需求。

2、開發(fā)架構(gòu)視角,從系統(tǒng)開發(fā)人員的角度來考慮問題,設(shè)計(jì)的架構(gòu)要易于理解,易于開發(fā),易于單元測試,更好做到讓開發(fā)人員可以用最少的代碼行數(shù)完成功能的開發(fā)。

3、運(yùn)行架構(gòu)視角,從系統(tǒng)運(yùn)行時(shí)的質(zhì)量需求考慮問題,特別關(guān)注于系統(tǒng)的非功能需求,客戶常常都會(huì)要求我們系統(tǒng)的功能畫面的最長響應(yīng)時(shí)間不超過4秒,能滿足2023個(gè)用戶同時(shí)在線使用,基于角色的系統(tǒng)資源的安全控制等。

4、物理架構(gòu)視角,關(guān)注系統(tǒng)安裝和部署在什么樣的環(huán)境上,例如現(xiàn)在更流行的企業(yè)應(yīng)用服務(wù)解決方案IBM Http Server + WebSphere Application Server + DB2,WebLogic + Oracle等。

5、數(shù)據(jù)架構(gòu)視角,如今我們開發(fā)的各類系統(tǒng),如MIS,ERP,SAP,基本上都是對各類數(shù)據(jù)的操作,把一堆不太好懂的數(shù)據(jù)展現(xiàn)成用戶容易看懂的數(shù)據(jù),自動(dòng)處理各類數(shù)據(jù)的運(yùn)算等,所以數(shù)據(jù)的持久化是十分重要的一件事情。

1、分析需求和理解業(yè)務(wù)模型(或領(lǐng)域建模),并選定關(guān)鍵Use case。

軟件的需求,可以分為從用戶視角和開發(fā)人員視角來看,從用戶的角度看,又可以分為功能性和非功能性需求,我們必須從不同的視角和級別去全面的認(rèn)識(shí)需求并分析需求,理解業(yè)務(wù)模型。實(shí)踐表明,常常被我們忽視的非功能性需求常常會(huì)導(dǎo)致整個(gè)項(xiàng)目失敗。

理解業(yè)務(wù)需求更好的方式莫過于進(jìn)行領(lǐng)域建模,領(lǐng)域建模與需求分析往往是交替穿叉進(jìn)行的,領(lǐng)域建模主要有以下三個(gè)方面的作用:

◆探索復(fù)雜問題,弄清領(lǐng)域知識(shí)。Martin Fowler曾經(jīng)說過,他采用面向?qū)ο蠓椒ǜ蟮暮锰幘褪撬兄诮鉀Q更為復(fù)雜的問題。領(lǐng)域建模本身作為輔助思維的工具,幫助我們將注意力始終保持在最為重要的業(yè)務(wù)概念及其關(guān)系上,使我們能夠不斷深入地,系統(tǒng)的對需求進(jìn)行分析和認(rèn)識(shí)。領(lǐng)域建模往往是一個(gè)從模糊到清晰,從零散到系統(tǒng)的過程。

◆決定功能范圍,影響可擴(kuò)展性。任何模型都是對現(xiàn)實(shí)世界某種程序的抽象,這種抽象就會(huì)忽略某一些東西,例如忽略對象的屬性和對象間的關(guān)系,而這些忽略往往都是帶有一定的目的性的,這種忽略就決定了功能的范圍。模型揭示了各種功能背后的結(jié)構(gòu),如果說定義功能相當(dāng)于“拍照片”的話,那么領(lǐng)域建模就相當(dāng)于“做透視”,更加關(guān)注問題領(lǐng)域的內(nèi)在結(jié)構(gòu),相當(dāng)于對問題領(lǐng)域進(jìn)行了一定的抽象,良好的領(lǐng)域模型不僅能很好的支持現(xiàn)有的功能,而且還可以在一定程度上支持未來可能出現(xiàn)的新需求,體現(xiàn)良好的可擴(kuò)展性。

◆提供交流基礎(chǔ),促進(jìn)有效溝通。領(lǐng)域建模通常會(huì)使用UML圖作為呈現(xiàn)的方式,這樣為我們的溝通提供了方便。當(dāng)然,有時(shí)候文字在描述某些特定領(lǐng)域的問題時(shí)可能更適合,可以靈活運(yùn)用。

在我們公司的實(shí)際軟件開發(fā)流程中,往往領(lǐng)域建模缺少這一環(huán)節(jié),這可能是在以后的工作中需要進(jìn)一步提高之處。

雖然我們總是期望架構(gòu)設(shè)計(jì)師能全面掌握需求,但由于時(shí)間和精力的限制,擺在我們面前的現(xiàn)實(shí)就是架構(gòu)設(shè)計(jì)師沒有時(shí)間對所有需求進(jìn)行深入分析,所以我們的策略就是“把好鋼用在刀刃上”,即把大部分時(shí)間和精力花在對決定架構(gòu)最重要的關(guān)鍵需求上。在選擇關(guān)鍵需求時(shí)要注意:高優(yōu)先級的需求往往是從用戶的角度來看的,可能并不是真正的關(guān)鍵需求。在《RUP實(shí)踐者指南》一書中向我們講述了如何確定關(guān)鍵功能需求?A.作為應(yīng)用程序的核心或?qū)崿F(xiàn)了系統(tǒng)的主要接口的功能,B.必須被實(shí)現(xiàn)的功能,即如果這些功能不被實(shí)現(xiàn),則開發(fā)出來的軟件就失去了價(jià)值,C.覆蓋了系統(tǒng)架構(gòu)的一些方面,但沒有被其他重要的Use case覆蓋到的功能。

2、分別從各個(gè)視角來考慮軟件架構(gòu)的方方面面。

軟件的架構(gòu)設(shè)計(jì)必須考慮到各方面,根據(jù)前期工作確立的領(lǐng)域模型,關(guān)鍵需求,系統(tǒng)約束等進(jìn)行設(shè)計(jì),必須從系統(tǒng)用戶,開發(fā)人員,系統(tǒng)管理員,部署管理員,數(shù)據(jù)管理員等人員的角度去分析并解決問題。比如說,如果我們的運(yùn)行架構(gòu)采用Cluster方式時(shí),就必須小心Cache和Session等的使用;如果我們的業(yè)務(wù)邏輯要求我們要操作多個(gè)數(shù)據(jù)庫時(shí),就要考慮采用支持二階段事務(wù)提交的方式。

只有將這些方方面面的問題都考慮到了,這樣的架構(gòu)設(shè)計(jì)才是完整的。至于每一個(gè)視圖中,我們應(yīng)該設(shè)計(jì)到什么細(xì)節(jié)這一問題,實(shí)際上與整個(gè)項(xiàng)目的過程定義有關(guān)。例如,如果我們有專門安排數(shù)據(jù)庫概要設(shè)計(jì)的活動(dòng),那我們在架構(gòu)設(shè)計(jì)的過程中就可以只需要關(guān)注更高層次的數(shù)據(jù)庫特性及數(shù)據(jù)庫之間的關(guān)系,而每一張表的數(shù)據(jù)字典可以在后續(xù)的相關(guān)活動(dòng)中進(jìn)行設(shè)計(jì),但如果沒有這樣的活動(dòng),那我們就要細(xì)化到每一張表的每一個(gè)欄位,以及表之間的關(guān)系。

3、解決技術(shù)面的重點(diǎn)問題和難題

在軟件架構(gòu)設(shè)計(jì)的過程中,我們往往會(huì)需要攻克一些技術(shù)面的重點(diǎn)問題和難題,這完全是一項(xiàng)極其需要扎實(shí)的理論知識(shí)和豐富的實(shí)踐經(jīng)驗(yàn)支撐的工作。例如,我們?nèi)绾翁岣哒麄€(gè)系統(tǒng)的性能?如何能很好的導(dǎo)出極其復(fù)雜的“中國式報(bào)表”(一般比西方國家產(chǎn)出的報(bào)表要復(fù)雜很多,而且很多開源的BI類的框架并不能完全解決問題)?

當(dāng)遇到確實(shí)是很困難的問題,可以去百度一下或Google一下,也可以去請教公司的資深技術(shù)人員或?qū)<遥蛘哒匍_小范圍的技術(shù)專題討論會(huì)議,采用腦力激蕩的方法試著找找答案,這樣才能提高工作的效率。

4、召開架構(gòu)設(shè)計(jì)評審會(huì)議進(jìn)行同行評審。

架構(gòu)設(shè)計(jì)評審是極其重要的一環(huán),我曾將其形容為“七種武器”中的離別鉤,就是因?yàn)樵跁?huì)議上,同行們可能會(huì)提很多問題或意見,而且很多意見很尖銳,所以一定要虛心接受,并做好記錄,正所謂“良藥苦口利于病,忠言逆耳利于行”。

在評審會(huì)議之前,我們要完成很多準(zhǔn)備工作,更好是能準(zhǔn)備一份簡明扼要的電子簡報(bào),把最重要的問題列出來,這樣在進(jìn)行評審會(huì)議時(shí),就不會(huì)漫無目的,在會(huì)議前就將這些資料發(fā)給與會(huì)人員,請他們抽空先了解一下,在會(huì)議進(jìn)行時(shí),要學(xué)會(huì)控制會(huì)議的進(jìn)度,提高會(huì)議的效率。

5、針對關(guān)鍵Use case在設(shè)計(jì)的架構(gòu)上實(shí)現(xiàn)功能來驗(yàn)證架構(gòu)。

對于架構(gòu)設(shè)計(jì)的驗(yàn)證也是一項(xiàng)十分重要的工作,其驗(yàn)證技術(shù)有很多種,在我們公司通常會(huì)采用Sample的形式,即XP中所說的迭代0,RUP中所說的切片。這樣做的好處是既可以從實(shí)際的產(chǎn)品角度出發(fā)來有效的驗(yàn)證架構(gòu)是否滿足要求,又可以比拋棄型原型驗(yàn)證技術(shù)節(jié)省成本。

這個(gè)Sample絕不是我們在解決架構(gòu)設(shè)計(jì)中的問題時(shí)拿來做實(shí)驗(yàn)的一些代碼的拼湊,而是完整的實(shí)現(xiàn)某一關(guān)鍵Use case的符合架構(gòu)設(shè)計(jì)和一系列規(guī)范的可交付的代碼及相關(guān)文檔。同時(shí),這個(gè)Sample可以作為你在給大家講解或培訓(xùn)架構(gòu)時(shí)的教材,也可以作為開發(fā)人員使用此架構(gòu)進(jìn)行開發(fā)的藍(lán)本,甚至是只需要復(fù)制粘貼,加上簡單的修改即可。

6、交付給客戶Review。

這一環(huán)節(jié),在很多公司可能并不存在,因?yàn)樗麄兊能浖軜?gòu)并不一定需要客戶Review,但像我們這種做服務(wù)的公司,最重要的就是客尊,落實(shí)到軟件架構(gòu)設(shè)計(jì)這一活動(dòng),就是讓客戶理解并接受你的架構(gòu)設(shè)計(jì)方案,同時(shí),客戶也會(huì)起到幫你驗(yàn)證架構(gòu)的作用。通常,我們的架構(gòu)得到客戶的認(rèn)可后,便可進(jìn)入大規(guī)模的開發(fā)。

在交付給客戶Review時(shí),通??赡軙?huì)以會(huì)議的形式進(jìn)行Review,所以我們可以參照評審會(huì)議時(shí)好的做法來召開會(huì)議,在這里就不再冗述。

軟件架構(gòu)設(shè)計(jì)的常見誤區(qū)及解決辦法

1、架構(gòu)設(shè)計(jì)的常常會(huì)“高來高去”。所謂高來高去,實(shí)際上就是我們的架構(gòu)設(shè)計(jì)僅停留在模型階段,但也絕不是產(chǎn)生之一支樣例程式。

2、架構(gòu)設(shè)計(jì)時(shí)常常會(huì)在某些方面過度設(shè)計(jì)(Over engineering)。為了一些根本不會(huì)發(fā)生的變化而進(jìn)行一系列復(fù)雜的設(shè)計(jì),這樣的設(shè)計(jì)就叫過度設(shè)計(jì),往往會(huì)帶來資源的浪費(fèi)并且會(huì)增加開發(fā)的工作量或難度。雖然我們必須考慮到系統(tǒng)的擴(kuò)展性,可維護(hù)性等,但切忌過度設(shè)計(jì)。有時(shí)候或許你并不能判斷出哪些設(shè)計(jì)是過度設(shè)計(jì),此時(shí)你可以請教你的PM,讓他站在整個(gè)項(xiàng)目的高度來幫你決策一下。

3、架構(gòu)(Architecture)不是框架(Framework),也不是簡單的將幾種框架或技術(shù)的組合,框架本身也是有架構(gòu)的??蚣芤话闶轻槍τ谀骋环矫婊蝾I(lǐng)域的重用性和可擴(kuò)展性非常好的半成品,我們可以用一句較為經(jīng)典的話來總結(jié):框架是軟件,架構(gòu)不是軟件,框架是一種特殊的軟件。我們在工作中通過將許多方面的可重用的工具類,公共類,基礎(chǔ)類等抽象出來,即可形成一些可重用的框架。

4、架構(gòu)設(shè)計(jì)絕不是新技術(shù)展示平臺(tái),合適的技術(shù)才是對于項(xiàng)目有利的技術(shù),必須考慮到開發(fā)人員的能力和維護(hù)人員的能力。作為一名架構(gòu)設(shè)計(jì)師應(yīng)該更多的考慮如何平衡業(yè)務(wù)需求,織織運(yùn)作(主要指團(tuán)隊(duì)中的協(xié)作)和技術(shù)三者的關(guān)系,而不僅僅是去關(guān)注那些技術(shù)細(xì)節(jié)。

5、架構(gòu)設(shè)計(jì)的成功與否決定著系統(tǒng)品質(zhì)的好壞,因?yàn)榧軜?gòu)設(shè)計(jì)不好而導(dǎo)致交付的系統(tǒng)Bug過多,無法滿足客戶非功能性需求等問題,從而導(dǎo)致項(xiàng)目取消的案例時(shí)有發(fā)生。架構(gòu)設(shè)計(jì)不是架構(gòu)設(shè)計(jì)師一個(gè)人的事情,也不是幾天就能完成的一項(xiàng)工作,必須是架構(gòu)設(shè)計(jì)師付出大量辛勤勞動(dòng)后的成果,其成敗往往與組織、主管、項(xiàng)目經(jīng)理的支持有著密切的關(guān)系。

關(guān)于架構(gòu)設(shè)計(jì)的一點(diǎn)通用技巧

1、分層(Layer)規(guī)則。這里的層是指邏輯上的層次(Layer),并非指物理上的層次(Tier)。目前的絕大多數(shù)的企業(yè)級應(yīng)用系統(tǒng)中都分為三層,即表現(xiàn)層,領(lǐng)域?qū)雍蛿?shù)據(jù)層。在對各層次進(jìn)行劃分時(shí),主要可以從以下幾個(gè)方面來考慮:A、每一層是一個(gè)相對獨(dú)立的部分,可以作為一個(gè)整體,無需對其它層了解;B、將層次間的依賴性降到更低,即降低耦合;C、可以從某種程度上替換掉某一層,而對其它層不會(huì)產(chǎn)生過多的影響;D,層次并不能封閉所有的東西,假如用戶界面上增加了一個(gè)欄位,那么領(lǐng)域?qū)泳鸵黾右粋€(gè)數(shù)據(jù)域,數(shù)據(jù)層就要增加一個(gè)相應(yīng)的字段。同時(shí),過多的分層可能會(huì)對性能造成一定的影響。

2、包(package)之間不要產(chǎn)生循環(huán)依賴。通常包的劃分會(huì)先按不同的邏輯層來劃分,在層的包下面再按功能來劃分。避免包間的循環(huán)依賴是一個(gè)比較通用的規(guī)則,這樣的規(guī)則一定有其存在的價(jià)值和道理,之所以這樣主要是出于以下原因:A、循環(huán)依賴會(huì)使分層失去意義;B、循環(huán)依賴會(huì)帶來許多潛在的風(fēng)險(xiǎn),如可能會(huì)產(chǎn)生嵌套事務(wù)(nested transaction,JavaEE標(biāo)準(zhǔn)中并不支持這種事務(wù))的現(xiàn)象,我就曾遇到過這樣的問題,在一個(gè)項(xiàng)目中,事務(wù)放在業(yè)務(wù)邏輯層統(tǒng)一控制,但由于開發(fā)人員忽視了架構(gòu)中這樣的原則,在持久層調(diào)用了展現(xiàn)層的公用類,形成了回圈的現(xiàn)象,導(dǎo)致了嵌套事務(wù)的發(fā)生。

3、設(shè)計(jì)模式的應(yīng)用。在很多人的觀念里,提供設(shè)計(jì)模式就等同于GOF的設(shè)計(jì)模式,其實(shí)設(shè)計(jì)模式是個(gè)廣泛的概念,比如需求模式、領(lǐng)域模式、反模式等都屬于設(shè)計(jì)模式。模式其實(shí)是一門工具,是人們對于過去解決某一類問題的經(jīng)驗(yàn)總結(jié),所以我們可以在設(shè)計(jì)活動(dòng)中應(yīng)用各種設(shè)計(jì)模式,但是在應(yīng)用這些模式之前一定要先分析清楚問題,否則就可能出現(xiàn)“牛頭不對馬嘴”的現(xiàn)象。

成功的項(xiàng)目總有相似之處,失敗的項(xiàng)目卻各有各的失敗之處。好的軟件架構(gòu)設(shè)計(jì)必定是成功項(xiàng)目的相似之處,我們有什么理由不把軟件架構(gòu)設(shè)計(jì)做好了?

數(shù)據(jù)庫事務(wù)循環(huán)依賴的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于數(shù)據(jù)庫事務(wù)循環(huán)依賴,分析數(shù)據(jù)庫事務(wù)循環(huán)依賴的影響與解決方法,一篇讓你學(xué)會(huì) 11個(gè)Spring 失效場景,如何運(yùn)用物理識(shí)圖,邏輯識(shí)圖進(jìn)行軟件架構(gòu)設(shè)計(jì)的信息別忘了在本站進(jìn)行查找喔。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


當(dāng)前名稱:分析數(shù)據(jù)庫事務(wù)循環(huán)依賴的影響與解決方法(數(shù)據(jù)庫事務(wù)循環(huán)依賴)
文章來源:http://m.5511xx.com/article/dhopcds.html