七、數據庫的併發:當多個用戶同時修改數據庫時的處理。這一部分只是在一些特殊狀況才考慮。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"/>