Hibernate數據庫的併發

七、數據庫的併發:當多個用戶同時修改數據庫時的處理。這一部分只是在一些特殊狀況才考慮。java

7.一、併發修改可能出現的問題程序員

    當兩個線程同時修改一個對象時,後操做的對象會將前一個操做對象所更新的值還原。數據庫

    這樣就可能存在併發的問題。session

    若是須要解決併發須要爲其增長鎖來控制訪問的狀況。併發

    有兩種方案:this

    一、悲觀鎖(基於數據庫的機制的鎖)線程

    二、樂觀鎖(基於Hibernate來加載的鎖)code

7.二、悲觀鎖:悲觀鎖是基於數據庫來進行控制xml

    當這個對象被上鎖以後,只能有一個線程對其進行操做,若是第二個線程要想操做,只能等待第一個線程
    操做完成後再進行操做,因此悲觀鎖效率很低(通常不使用)。對象

session = HibernateUtil.openSession();
			session.beginTransaction();
			//只要使用這種方式來load就會爲其增長鎖
//			Student stu = session.load(Student.class, 1,LockOptions.UPGRADE);

7.三、樂觀鎖:因爲悲觀鎖的效率不高,Hibernate提供了一種樂觀鎖的機制。

    其實就是爲每個對象增長一個版本號(等於在數據庫中增長一個字段,這個字段由Hibernate來維護,
    不禁程序員控制)。

    原理是:當對象被修改以後會在其版本號上面加1,第二個線程再修改時版本號已經變了,就會拋出異常

    如何枷鎖:

    一、建立相應的字段

private int version;
	
	public int getVersion() {
		return version;
	}
	public void setVersion(int version) {
		this.version = version;
	}

    二、設置version

    Annotation:

private int version;
	
	@Version
	public int getVersion() {
		return version;
	}
	public void setVersion(int version) {
		this.version = version;
	}

    XML:

<id name="id">
            <generator class="native"/>
        </id>
        <!-- version必須id以後,在property以前 -->
        <version name="version"/>
		<property name="name"/>
		<property name="sex"/>
相關文章
相關標籤/搜索