一、 數(shù)據(jù)庫事務(wù)概念
數(shù)據(jù)庫事務(wù)的特征: ACID
Atomic (原子性)、 Consistency (一致性)、 Isolation (隔離性)和 Durability (持久性)。 DBMS 用日志來保證數(shù)據(jù)的原子性、一致性和持久性;用鎖的機(jī)制來保證數(shù)據(jù)的隔離性。
二、 事務(wù)的邊界
數(shù)據(jù)庫支持 2 種事務(wù)模式:自動(dòng)提交和手動(dòng)提交。
JDBC API 的事務(wù)邊界





















Hibernate API 聲明事務(wù)邊界





















注:一個(gè) session 可以對應(yīng)多個(gè)事務(wù),但是推薦的做法是一個(gè) session 對應(yīng)一個(gè)事務(wù)。
三、
多事務(wù)的并發(fā)問題當(dāng)多個(gè)事務(wù)同時(shí)訪問相同的數(shù)據(jù)的時(shí)候,程序如果沒有采取適當(dāng)?shù)母綦x措施,就會發(fā)生數(shù)據(jù)庫的并發(fā)問題。常見的并發(fā)問題有:
第一類丟失更新:撤消事務(wù)的時(shí)候,把其他的事務(wù)已經(jīng)提交的數(shù)據(jù)給覆蓋了;
臟讀;讀了沒有提交的數(shù)據(jù);
虛讀:一個(gè)事務(wù)讀到另外一個(gè)事務(wù)已經(jīng)提交的新插入的數(shù)據(jù);
不可重復(fù)讀:一個(gè)事務(wù)讀到另外一個(gè)事務(wù)已經(jīng)提交的更新的數(shù)據(jù);
第二類丟失更新:一個(gè)事務(wù)覆蓋另外一個(gè)事務(wù)已經(jīng)提交的更新數(shù)據(jù)。
四、 鎖
一般地,大型的 DBMS 都會自動(dòng)的管理鎖定機(jī)制,但是在對數(shù)據(jù)的安全性、完整性和一致性有特殊要求的地方,可以由事務(wù)本身來管理瑣的機(jī)制。
有一點(diǎn)要關(guān)注的是:鎖的粒度越大,隔離性越好,并發(fā)性越差。
按照鎖的程度來分有:
共享鎖:用讀操作,非獨(dú)占的,其他事務(wù)可以讀,但是不能更新,并發(fā)性好;
獨(dú)占鎖:用與 insert update 和 delete 等語句,其他事務(wù)不能讀,也不能改,并發(fā)性差;
更新鎖:執(zhí)行 update 的時(shí)候,加鎖。
死瑣:多是事務(wù)分別鎖定了一個(gè)資源,又請求鎖定對方已經(jīng)鎖定的資源,就造成了請求環(huán)。
降低死鎖的最好辦法是使用短事務(wù)。
五、 數(shù)據(jù)庫的事務(wù)隔離級別
數(shù)據(jù)庫提供 4 種事務(wù)隔離級別:
Serializable :串行化;(隔離級別最高) 1
Repeatable Read :可重復(fù)讀; 2
Read Commited :讀已提交數(shù)據(jù); 4
Read Uncommited :讀未提交數(shù)據(jù);(隔離級別最低) 8
Hiberate 中的隔離級別的設(shè)置
在 Hibernate 的配置文件中 hibernate.connection.isolation=2
六、 悲觀鎖和樂觀瑣
從應(yīng)用程序的角度來看,鎖分為悲觀鎖和樂觀鎖。
悲觀鎖:顯示的為程序加鎖,但是降低并發(fā)性。
Select ……. For update;
在 Hibernate 中的代碼
Session.get(Account.class,net Long(1),LockMode.UPGRADE) ; // 程序采用悲觀鎖
樂觀鎖:依靠 DBMS 來管理鎖,程序依靠版本控制來避免并發(fā)問題。
在對象 - 關(guān)系映射的文件中,用 <version> 或者 <timestamp> 可以管理并發(fā)。樂觀瑣比悲觀瑣有更好的并發(fā)性,優(yōu)先考慮樂觀瑣。