真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Spring的事務(wù)管理

一、事務(wù)的基礎(chǔ)知識

創(chuàng)新互聯(lián)建站一直在為企業(yè)提供服務(wù),多年的磨煉,使我們在創(chuàng)意設(shè)計(jì),成都全網(wǎng)營銷到技術(shù)研發(fā)擁有了開發(fā)經(jīng)驗(yàn)。我們擅長傾聽企業(yè)需求,挖掘用戶對產(chǎn)品需求服務(wù)價(jià)值,為企業(yè)制作有用的創(chuàng)意設(shè)計(jì)體驗(yàn)。核心團(tuán)隊(duì)擁有超過十余年以上行業(yè)經(jīng)驗(yàn),涵蓋創(chuàng)意,策化,開發(fā)等專業(yè)領(lǐng)域,公司涉及領(lǐng)域有基礎(chǔ)互聯(lián)網(wǎng)服務(wù)服務(wù)器托管、重慶APP開發(fā)、手機(jī)移動建站、網(wǎng)頁設(shè)計(jì)、網(wǎng)絡(luò)整合營銷。

  1. 數(shù)據(jù)庫事務(wù):復(fù)雜的事務(wù)要分步執(zhí)行,要么整體生效、要么整體失效。

  2. 必須滿足:原子性、一致性、隔離性、持久性。

  3. 數(shù)據(jù)并發(fā)問題:臟讀:A讀取了B未提交的更改數(shù)據(jù)。

             不可重復(fù)讀:A兩次讀,第二次讀到了B已經(jīng)提交的數(shù)據(jù)。(行級鎖)

             幻讀(虛讀):A讀取B新提交的新增數(shù)據(jù)。(需添加表級鎖)

             第一類丟失更新:A撤銷時恢復(fù)原數(shù)據(jù)把B提交的數(shù)據(jù)覆蓋了。

             第二類丟失更新:A提交時覆蓋了B已經(jīng)提交的數(shù)據(jù)。

  4. 數(shù)據(jù)庫鎖機(jī)制:一般分為表鎖和行鎖,按并發(fā)來分有共享鎖和獨(dú)占鎖。數(shù)據(jù)庫必須在更改的行上施加獨(dú)占鎖;行共享鎖、行獨(dú)占鎖、表共享鎖、表共享行獨(dú)占鎖、表獨(dú)占鎖。

  5. 事務(wù)隔離級別:

Spring的事務(wù)管理

6.JDBC對事務(wù)的支持

二、ThreadLocal

  1. 概念:ThreadLocal是保存線程本地化的容器,為每個使用該變量的線程分配一個獨(dú)立的變量副本。

  2. 原理:通過Map來保存每個線程的變量副本,key為線程對象,值為線程的副本。

public class TestNum {  
    // ①通過匿名內(nèi)部類覆蓋ThreadLocal的initialValue()方法,指定初始值  
    private static ThreadLocal seqNum = new ThreadLocal() {  
        public Integer initialValue() {  
            return 0;  
        }  
    };  
  
    // ②獲取下一個序列值  
    public int getNextNum() {  
        seqNum.set(seqNum.get() + 1);  
        return seqNum.get();  
    }  
  
    public static void main(String[] args) {  
        TestNum sn = new TestNum();  
        // ③ 3個線程共享sn,各自產(chǎn)生序列號  
        TestClient t1 = new TestClient(sn);  
        TestClient t2 = new TestClient(sn);  
        TestClient t3 = new TestClient(sn);  
        t1.start();  
        t2.start();  
        t3.start();  
    }  
  
    private static class TestClient extends Thread {  
        private TestNum sn;  
  
        public TestClient(TestNum sn) {  
            this.sn = sn;  
        }  
  
        public void run() {  
            for (int i = 0; i < 3; i++) {  
                // ④每個線程打出3個序列值  
                System.out.println("thread[" + Thread.currentThread().getName() + "] --> sn["  
                         + sn.getNextNum() + "]");  
            }  
        }  
    }  
}

在spring中大部分Bean都可以聲明為singleton,故而spring要對這些非線程安全bean采用Threadlocal進(jìn)行封裝,這樣有狀態(tài)的bean就能夠以sigleton的方式在多線程中正常工作。spring通過Threadlocal來實(shí)現(xiàn)事務(wù)管理

三、spring對事務(wù)的支持

  1. spring封裝了事務(wù)模版類TranscationTemplate.

  2. 事務(wù)管理主要有3個接口:PlatformTransactionManager,TransactionDefinition,TransactionStatus.

TransactionDefinition:用于描述事務(wù)的隔離級別、超時時間、等事務(wù)屬性;

PlatformTransactionManager根據(jù)TransactionDefinition提供的事務(wù)屬性來創(chuàng)建事務(wù);就三個方法getTransaction、commit、rollback;

TransactionStatus描述激活事務(wù)的狀態(tài);

3.spring把事務(wù)管理委托給底層具體的持久化實(shí)現(xiàn)框架來完成,為不同的持久化框架提供了不同的PlatformTransactionManager接口的實(shí)現(xiàn)類。


      3)引用數(shù)據(jù)源

Hibernate

1)Hibernate配置


    
        
        com.MySQL.jdbc.Driver
        
        jdbc:mysql://localhost/hibernate_test
        
        root
        
        cheng
        
        20
        
        1
        
        5000
        
        100
        3000
        2
        true
        
        org.hibernate.dialect.MySQL5InnoDBDialect
        
        update
        
        true
        
        true
        
        false
        
        
        
    

hibernate.cfg.xml文件的主要作用就是配置了一個session-factory

  1. 在session-factory中主要通過property配置一些數(shù)據(jù)庫的連接信息,我們知道,spring通常會將這種數(shù)據(jù)庫連接用dataSource來表示,這樣一來,hibernate.cfg.xml文件中的所有跟數(shù)據(jù)庫連接的都可以干掉了,直接用spring的dataSource,而dataSource也可以用c3p0、dbcp等。

  2. 在session-factory中通過property除了配置一些數(shù)據(jù)庫的連接信息之外,還有一些hibernate的配置,比如方言、自動創(chuàng)建表機(jī)制、格式化sql等,這些信息也需要配置起來。

  3. 還有最關(guān)鍵的一個持久化類所在路徑的配置

2)spring的sessionFactroy配置


    

    
        
        
            
                
                com.wechat.entity.po
            
        
        
            
                ${hibernate.hbm2ddl.auto}
                ${hibernate.dialect}
                ${hibernate.show_sql}
                ${hibernate.format_sql}
                false
            
        
    

四、聲明事務(wù)

1.基于aop/tx命名空間的配置:spring在Schema的配置中添加了一個tx命名空間,在配置文件中定義事務(wù)屬性。




    

    
    
    
    
        
        
        
        
    
    
    
        
            
            
            
        
    
    
    

2.使用注解配置聲明式事務(wù)

1)在xml中配置




2)在業(yè)務(wù)類上注解

@Service
@Transactional
public class BbtForum {
    public ForumDao forumDao;

    public TopicDao topicDao;

    public PostDao postDao;
    ...}

3)@Transactional的屬性

默認(rèn)屬性:

事務(wù)傳播行為:PROPAGATION_REQUIRED

事務(wù)隔離級別:IOSLATION_DEFAULT

讀寫事務(wù)屬性:讀/寫事務(wù)

超時時間:-1

回滾設(shè)置:熱河運(yùn)行期異常引發(fā)回滾、任何檢查型異常不會引發(fā)回滾

4)spring要在具體的業(yè)務(wù)類上使用@Transactional注解

5)在方法處使用注解會覆蓋類定義的注解,如果方法需要使用特殊的事務(wù)屬性,可以在方法上使用注解

@Transactional(readOnly = true)
public Forum getForum(int forumId) {
    return forumDao.getForum(forumId);
}

五、事務(wù)的一些注意點(diǎn)

1.使用不同的事務(wù)管理器

@Transactional("name")使用名為name的事務(wù)管理器

2.事務(wù)管理的目的是保證數(shù)據(jù)操作的事務(wù)性(原子性、一致性、隔離性、持久性)脫離了事務(wù),DAO一樣可以進(jìn)行數(shù)據(jù)操作。

3.事務(wù)的傳播性

PROPAGATION_REQUIERD:如果當(dāng)前沒有事務(wù)就創(chuàng)建一個,有就加進(jìn)去

PROPAGATION_SUPPORTS:支持當(dāng)前事務(wù),沒有就以非事務(wù)方式執(zhí)行

PROPAGATION_MANDATORY:使用當(dāng)前事務(wù),沒有就拋出異常

PROPAGATION_REQURES_NEW:新建事務(wù),如果當(dāng)前存在事務(wù),就將其掛起

PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式執(zhí)行,如果當(dāng)前有就掛起

PROPAGATION_NEVER:以非事務(wù)方式執(zhí)行,如果有就掛起

PROPAGATION_NESTED:嵌套事務(wù)

相同線程中進(jìn)行互相嵌套調(diào)用的事務(wù)方法工作在相同的事務(wù)中,如果在不同線程,則不同線程下事務(wù)方法工作在獨(dú)立的事務(wù)中。


標(biāo)題名稱:Spring的事務(wù)管理
地址分享:http://weahome.cn/article/jppijo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部