成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于Spring中的事務(wù)管理機(jī)制

SnaiLiu / 2197人閱讀

摘要:中的事務(wù)管理分類編程式事務(wù)管理機(jī)制聲明式事務(wù)管理機(jī)制下面就銀行轉(zhuǎn)賬這一實(shí)例來(lái)講解如何利用這兩種由提供的事務(wù)處理機(jī)制來(lái)進(jìn)行相應(yīng)的事務(wù)處理。

什么是事務(wù)?

通俗理解,事務(wù)其實(shí)就是一系列指令的集合。

為什么要使用事務(wù)管理?
我們?cè)趯?shí)際業(yè)務(wù)場(chǎng)景中,經(jīng)常會(huì)遇到數(shù)據(jù)頻繁修改讀取的問(wèn)題。在同一時(shí)刻,不同的業(yè)務(wù)邏輯對(duì)同一個(gè)表數(shù)據(jù)進(jìn)行修改,這種沖突很可能造成數(shù)據(jù)不可挽回的錯(cuò)亂,所以我們需要用事務(wù)來(lái)對(duì)數(shù)據(jù)進(jìn)行管理。
事務(wù)的四個(gè)特性:

原子性
原子性:操作這些指令時(shí),要么全部執(zhí)行成功,要么全部不執(zhí)行。只要其中一個(gè)指令執(zhí)行失敗,所有的指令都執(zhí)行失敗,數(shù)據(jù)進(jìn)行回滾,回到執(zhí)行指令前的數(shù)據(jù)狀態(tài)。

一致性
事務(wù)的執(zhí)行使數(shù)據(jù)從一個(gè)狀態(tài)轉(zhuǎn)換為另一個(gè)狀態(tài),但是對(duì)于整個(gè)數(shù)據(jù)的完整性保持穩(wěn)定。

隔離性
在該事務(wù)執(zhí)行的過(guò)程中,無(wú)論發(fā)生的任何數(shù)據(jù)的改變都應(yīng)該只存在于該事務(wù)之中,對(duì)外界不存在任何影響。只有在事務(wù)確定正確提交之后,才會(huì)顯示該事務(wù)對(duì)數(shù)據(jù)的改變。其他事務(wù)才能獲取到這些改變后的數(shù)據(jù)。

持久性
當(dāng)事務(wù)正確完成后,它對(duì)于數(shù)據(jù)的改變是永久性的。

Spring中的事務(wù)管理分類:

編程式事務(wù)管理機(jī)制

聲明式事務(wù)管理機(jī)制

下面就銀行轉(zhuǎn)賬這一實(shí)例來(lái)講解如何利用這兩種由Spring提供的事務(wù)處理機(jī)制來(lái)進(jìn)行相應(yīng)的事務(wù)處理。

項(xiàng)目前準(zhǔn)備工作:

在項(xiàng)目中導(dǎo)入相應(yīng)的jar包

編寫項(xiàng)目相應(yīng)的接口和接口實(shí)現(xiàn)類,本項(xiàng)目有兩個(gè)接口--【AccountService,AccountDAO】,兩個(gè)接口實(shí)現(xiàn)類--【AccountServiceImpl,AccountDAOImpl】,具體代碼如下:

               **AccountService接口**

package cn.muke.spring.demo1;
/**

* @author 熊濤

 *銀行轉(zhuǎn)賬的業(yè)務(wù)層接口
 */
public interface AccountService {

    /*
     * @param out:轉(zhuǎn)出賬戶
     * @param in:轉(zhuǎn)入賬戶
     * @param money:轉(zhuǎn)賬金額
     */
    public void transfer(String out,String in,Double money);
    
}


            **AccountService接口實(shí)現(xiàn)類AccountServiceImpl**
package cn.muke.spring.demo1;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
public class AccountServiceImpl implements AccountService {    
    //注入轉(zhuǎn)賬的DAO
    private AccountDAO accountDao;    
    //注入事務(wù)管理的模板
    private TransactionTemplate transactionTemplate;

    /**
     * @param out    :轉(zhuǎn)出賬號(hào)
     * @param in    :轉(zhuǎn)入賬號(hào)
     * @param money    :轉(zhuǎn)賬金額
     */
    @Override
    public void transfer(final String out, final String in, final Double money) {
            
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {

            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
                accountDao.outMoney(out, money);
                int i = 1/0;
                accountDao.inMoney(in, money);
            }
        });
    }

    public void setAccountDao(AccountDAO accountDao) {
        this.accountDao = accountDao;
    }

    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }

}
           
           **AccountDAO接口**


package cn.muke.spring.demo1;
/**
 * @author 熊濤
 *轉(zhuǎn)賬案例DAO層的接口
 */
public interface AccountDAO {

    /*
     * @param out:轉(zhuǎn)出賬號(hào)
     * @param money:轉(zhuǎn)賬金額
     */
    public void outMoney(String out,Double money);
    /*
     * @param in:轉(zhuǎn)入賬戶
     * @param money:轉(zhuǎn)賬金額
     */
    public void inMoney(String in,Double money);
}


                    **AccountDAO接口的實(shí)現(xiàn)類AccountDAOImpl**

package cn.muke.spring.demo1;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
/**

@author 熊濤

*轉(zhuǎn)賬案例DAO層的實(shí)現(xiàn)類
*/
public class AccountDAOImpl extends JdbcDaoSupport implements AccountDAO {

/*
 * @param out:轉(zhuǎn)出賬號(hào)
 * @param money:轉(zhuǎn)賬金額
 */
@Override
public void outMoney(String out, Double money) {
    
    String sql = "update account set money = money - ? where name = ? ";
    this.getJdbcTemplate().update(sql, money,out);
}

/*
 * @param in:轉(zhuǎn)入賬戶
 * @param money:轉(zhuǎn)賬金額
 */
@Override
public void inMoney(String in, Double money) {
    
    String sql = "update account set money = money + ? where name = ? ";
    this.getJdbcTemplate().update(sql, money,in);
}

}

編程式事務(wù)管理機(jī)制
package cn.muke.spring.demo1;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
public class AccountServiceImpl implements AccountService {    
    //注入轉(zhuǎn)賬的DAO
    private AccountDAO accountDao;    
    //注入事務(wù)管理的模板
    private TransactionTemplate transactionTemplate;

    /**
     * @param out    :轉(zhuǎn)出賬號(hào)
     * @param in    :轉(zhuǎn)入賬號(hào)
     * @param money    :轉(zhuǎn)賬金額
     */
    @Override
    public void transfer(final String out, final String in, final Double money) {            
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
                accountDao.outMoney(out, money);
                int i = 1/0;
                accountDao.inMoney(in, money);
            }
        });
    }
    public void setAccountDao(AccountDAO accountDao) {
        this.accountDao = accountDao;
    }
    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }
}

解釋:主要是通過(guò)transaction提供的模板來(lái)進(jìn)行事務(wù)的處理。

使用聲明式的方法進(jìn)行事務(wù)處理 【1】基于TransactionProxyFactoryBean的事務(wù)處理機(jī)制

要點(diǎn):(1)主要是在Spring的配置文件中配置業(yè)務(wù)層的代理,代碼例如:


            
            
            
            
            
        
            
                
                PROPAGATION_REQUIRED
                
                
            
        
    

(2)在使用業(yè)務(wù)層時(shí)需注入業(yè)務(wù)層的代理

 @Resource(name="accountServiceProxy")
 
 

【2】基于AspectJ的XML方式

此種方式是利用了Spring AOP這一特性完成事務(wù)管理機(jī)制。其要點(diǎn)是配置事務(wù)通知和切面和切點(diǎn),而且此種代理為自動(dòng)代理。其在Spring配置文件的配置如下:
 
    
        
            
        
    
    
    
    
        
        
        
        
    

【3】基于注解的事務(wù)管理機(jī)制

其要點(diǎn)是在Spring配置文件完成事務(wù)的開(kāi)啟,另外還需在需要進(jìn)行事務(wù)管理的業(yè)務(wù)層類出標(biāo)記上事務(wù)的關(guān)鍵字,@Tansactional       

最后附上對(duì)于該項(xiàng)目的源碼,源碼中有一個(gè)名為database的文件改文件有關(guān)于創(chuàng)建數(shù)據(jù)庫(kù)的sql語(yǔ)句,另外源碼中海油對(duì)于每一種事務(wù)管理機(jī)制的測(cè)試類。
鏈接:https://pan.baidu.com/s/1hspMvnY 密碼:g2h7

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70877.html

相關(guān)文章

  • 2021 年最新基于 Spring Cloud 的微服務(wù)架構(gòu)分析

    摘要:是一個(gè)相對(duì)比較新的微服務(wù)框架,年才推出的版本雖然時(shí)間最短但是相比等框架提供的全套的分布式系統(tǒng)解決方案。提供線程池不同的服務(wù)走不同的線程池,實(shí)現(xiàn)了不同服務(wù)調(diào)用的隔離,避免了服務(wù)器雪崩的問(wèn)題。通過(guò)互相注冊(cè)的方式來(lái)進(jìn)行消息同步和保證高可用。 Spring Cloud 是一個(gè)相對(duì)比較新的微服務(wù)框架,...

    cikenerd 評(píng)論0 收藏0
  • Spring Cloud 分布式事務(wù)管理

    摘要:中大致分為兩部分事務(wù)管理器和本地資源管理器。具體實(shí)現(xiàn)分布式事務(wù)框架的核心功能是對(duì)本地事務(wù)的協(xié)調(diào)控制,框架本身并不創(chuàng)建事務(wù),只是對(duì)本地事務(wù)做協(xié)調(diào)控制。 Spring Cloud 分布式事務(wù)管理 在微服務(wù)如火如荼的情況下,越來(lái)越多的項(xiàng)目開(kāi)始嘗試改造成微服務(wù)架構(gòu),微服務(wù)即帶來(lái)了項(xiàng)目開(kāi)發(fā)的方便性,又提高了運(yùn)維難度以及網(wǎng)絡(luò)不可靠的概率. @[toc]在說(shuō)微服務(wù)的優(yōu)缺點(diǎn)時(shí),有對(duì)比才會(huì)更加明顯,首先...

    aboutU 評(píng)論0 收藏0
  • Java相關(guān)

    摘要:本文是作者自己對(duì)中線程的狀態(tài)線程間協(xié)作相關(guān)使用的理解與總結(jié),不對(duì)之處,望指出,共勉。當(dāng)中的的數(shù)目而不是已占用的位置數(shù)大于集合番一文通版集合番一文通版垃圾回收機(jī)制講得很透徹,深入淺出。 一小時(shí)搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解) 是一個(gè)接口,程序可以通過(guò)...

    wangtdgoodluck 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<