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



























Hibernate API 聲明事務邊界





























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