一、 數據庫事務概念
數據庫事務的特征: ACID
Atomic (原子性)、 Consistency (一致性)、 Isolation (隔離性)和 Durability (持久性)。 DBMS 用日志來保證數據的原子性、一致性和持久性;用鎖的機制來保證數據的隔離性。
二、 事務的邊界
數據庫支持 2 種事務模式:自動提交和手動提交。
JDBC API 的事務邊界
try
{
Connection conn = java.sql.DriverManager,.getConnection(dbUrl,dbUser,dbPwd);
conn.setAutoCommit( false ); // 設置成手動模式
stmt = conn.createStatement();
stmt.executeUpdate( "
. " ); // 數據庫更新1
stmt.executeUpdate( "
. " ); // 數據庫更新2
conn.commit();
}
catch (Exception e)

{
conn.rollback();
}
finally
{
stmt.close();
conn.close();
}
Hibernate API 聲明事務邊界
Session session = factory.openSession();
Transaction tx;
try

{
tx = session.beginTransaction(); // 開始事務
// 執行操作
。。。。。
tx.commit();
}
catch (Exception e)

{
if (tx != null )

{
tx.rollback();
}
}
finally
{
session.close();
}
注:一個 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> 可以管理并發。樂觀瑣比悲觀瑣有更好的并發性,優先考慮樂觀瑣。
http://www.tkk7.com/sodmewuhan/archive/2006/04/22/42505.html
posted on 2007-09-16 14:50
Ke 閱讀(1315)
評論(0) 編輯 收藏 所屬分類:
hibernate