hibernate教程--事务处理详解
生活随笔
收集整理的這篇文章主要介紹了
hibernate教程--事务处理详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Hibernate的事務處理
1、事務:
事務就是邏輯上的一組操作,要么全都成功,要么全都失敗!!!
2、事務特性:
-
原子性:事務一組操作不可分割.
-
一致性:事務的執行前后,數據完整性要保持一致.
-
隔離性:一個事務在執行的過程中不應該受到其他事務的干擾.
-
持久性:一旦事務結束,數據就永久保存數據庫.
如果不考慮事務的隔離性引發一些安全性問題:
5大類問題:3類讀問題 2類寫問題.
3、讀問題:
-
臟讀:一個事務讀到另一個事務未提交數據.
-
不可重復讀:一個事務讀到另一個事務已經提交數據(update),導致查詢結果不一致.
-
虛讀:一個事務讀到另一個事務已經提交的數據(insert),導致查詢結果不一致
-
避免三種讀的問題:
-
設置事務的隔離級別:
-
未提交讀:以上三種讀問題 都有可能發生.
-
已提交讀:避免臟讀,但是不可重復讀和虛讀有可能發生.
-
重復讀:避免臟讀和不可重復讀,但是虛讀是有可能發生.
-
串行的:可以避免以上三種讀問題.
-
在hibernate中設置事務的隔離級別:
-
在核心配置文件中:
4、 寫問題:丟失更新
- 解決;
悲觀鎖:
樂觀鎖;
線程綁定的session:
在Hibernate.cfg.xml中配置一個:
thread
-
使用SessionFactory中的getCurrentSession();方法.
-
底層就是ThreadLocal.
5、測試
package com.sihai.hibernate3.test; import org.hibernate.LockMode; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import com.sihai.hibernate3.demo1.Customer; import com.sihai.utils.HibernateUtils; /** * Hibernate的事務與并發的測試類: * @author sihai * */ public class HibernateTest5 { @Test public void demo9(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer = new Customer(); customer.setCname("李四"); session.save(customer); tx.commit(); // session.close(); } @Test // 本地Session public void demo8(){ Session session1 = HibernateUtils.getCurrentSession(); Session session2 = HibernateUtils.getCurrentSession(); System.out.println(session1 == session2); } @Test // 本地Session public void demo7(){ Session session1 = HibernateUtils.openSession(); Session session2 = HibernateUtils.openSession(); System.out.println(session1 == session2); } @Test // 樂觀鎖解決丟失更新: public void demo6(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class,3); customer.setAge(36); tx.commit(); session.close(); } @Test // 樂觀鎖解決丟失更新: public void demo5(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class,3); customer.setCname("鐵男"); tx.commit(); session.close(); } @SuppressWarnings("deprecation") @Test // 悲觀鎖解決丟失更新: public void demo4(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class,3,LockMode.UPGRADE); customer.setAge(36); tx.commit(); session.close(); } @SuppressWarnings("deprecation") @Test // 悲觀鎖解決丟失更新: public void demo3(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class,3,LockMode.UPGRADE); customer.setCname("鐵男"); tx.commit(); session.close(); } @Test // 演示丟失更新 public void demo2(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 3); customer.setAge(36); tx.commit(); session.close(); } @Test // 演示丟失更新 public void demo1(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 3); customer.setCname("鐵男"); tx.commit(); session.close(); } }總結
以上是生活随笔為你收集整理的hibernate教程--事务处理详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lucene教程--维护索引、查询对象和
- 下一篇: 蓝桥杯-区间k大数查询(java)