標籤:ext 檔案中 div tom 性問題 action ade demo ber
事務:事務就是邏輯上的一組操作,要麼全都成功,要麼全都失敗!!!
事務特性
原子性:事務一組操作不可分割.
一致性:事務的執行前後,資料完整性要保持一致.
隔離性:一個事務在執行的過程中不應該受到其他事務的幹擾.
持久性:一旦事務結束,資料就永久儲存資料庫.
如果不考慮事務的隔離性引發一些安全性問題:
5大類問題:3類讀問題 2類寫問題.
讀問題:
髒讀:一個事務讀到另一個事務未提交資料.
不可重複讀取:一個事務讀到另一個事務已經提交資料(update),導致查詢結果不一致.
虛讀:一個事務讀到另一個事務已經提交的資料(insert),導致查詢結果不一致
避免三種讀的問題(設定事務的隔離等級):
未提交讀:以上三種讀問題 都有可能發生.
已提交讀:避免髒讀,但是不可重複讀取和虛讀有可能發生.
重複讀:避免髒讀和不可重複讀取,但是虛讀是有可能發生.
串列的:可以避免以上三種讀問題.
在Hibernate中設定事務的隔離等級
在核心設定檔中
<!-- 1—Read uncommitted isolation 2—Read committed isolation 4—Repeatable read isolation 8—Serializable isolation--><property name="hibernate.connection.isolation">4</property>
寫問題:丟失更新
解決
悲觀鎖:依賴於資料庫機制,鎖住當前資料,其它任何使用者都不能讀取或修改
@Test/** 使用悲觀鎖解決丟失更新*/public void demo4(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); // 使用悲觀鎖(獨佔鎖定),LockMode.UPGRADE:利用資料庫的for update字句加鎖 Customer customer = (Customer) session.get(Customer.class, 3, LockMode.UPGRADE); customer.setAge(32); tx.commit(); session.close();}
樂觀鎖:不作資料庫層次上的鎖定,為了維護正確的資料,樂觀鎖採用應用程式上的邏輯實現版本控制的方法(在資料庫中加入一個VERSON欄記錄,在讀取數 據時連同版本號碼一同讀取,並在更新資料時遞增版本號碼,然後比對版本號碼與資料庫中的版本號碼,如果大於資料庫中的版本號碼則予以更新,否則就回報錯誤)
public class Customer { private Integer cid; private String cname; private Integer version; public Integer getVersion() { return version; } public void setVersion(Integer version) { this.version = version; } public Integer getCid() { return cid; } public void setCid(Integer cid) { this.cid = cid; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; }}
<hibernate-mapping > <class name="cn.yzu.vo.Customer" batch-size="2" table="customer" lazy="true"> <id name="cid" column="cid"> <generator class="native"/> </id> <version name="version"/> <property name="cname" column="cname" length="30"/> </class></hibernate-mapping>
線程綁定的session
在Hibernate.cfg.xml中配置一個:<property name="hibernate.current_session_context_class">thread</property>
使用SessionFactory中的getCurrentSession()方法
底層就是ThreadLocal
當前線程中的session不需要進行關閉,線程結束後自動關閉!!!
Hibernate的交易處理