Hibernate的交易處理

來源:互聯網
上載者:User

標籤: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的交易處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.