hibernate教程--事务处理详解
Hibernate的事務(wù)處理
1、事務(wù):
事務(wù)就是邏輯上的一組操作,要么全都成功,要么全都失敗!!!
2、事務(wù)特性:
-
原子性:事務(wù)一組操作不可分割.
-
一致性:事務(wù)的執(zhí)行前后,數(shù)據(jù)完整性要保持一致.
-
隔離性:一個(gè)事務(wù)在執(zhí)行的過(guò)程中不應(yīng)該受到其他事務(wù)的干擾.
-
持久性:一旦事務(wù)結(jié)束,數(shù)據(jù)就永久保存數(shù)據(jù)庫(kù).
如果不考慮事務(wù)的隔離性引發(fā)一些安全性問(wèn)題:
5大類問(wèn)題:3類讀問(wèn)題 2類寫問(wèn)題.
3、讀問(wèn)題:
-
臟讀:一個(gè)事務(wù)讀到另一個(gè)事務(wù)未提交數(shù)據(jù).
-
不可重復(fù)讀:一個(gè)事務(wù)讀到另一個(gè)事務(wù)已經(jīng)提交數(shù)據(jù)(update),導(dǎo)致查詢結(jié)果不一致.
-
虛讀:一個(gè)事務(wù)讀到另一個(gè)事務(wù)已經(jīng)提交的數(shù)據(jù)(insert),導(dǎo)致查詢結(jié)果不一致
-
避免三種讀的問(wèn)題:
-
設(shè)置事務(wù)的隔離級(jí)別:
-
未提交讀:以上三種讀問(wèn)題 都有可能發(fā)生.
-
已提交讀:避免臟讀,但是不可重復(fù)讀和虛讀有可能發(fā)生.
-
重復(fù)讀:避免臟讀和不可重復(fù)讀,但是虛讀是有可能發(fā)生.
-
串行的:可以避免以上三種讀問(wèn)題.
-
在hibernate中設(shè)置事務(wù)的隔離級(jí)別:
-
在核心配置文件中:
4、 寫問(wèn)題:丟失更新
- 解決;
悲觀鎖:
樂(lè)觀鎖;
線程綁定的session:
在Hibernate.cfg.xml中配置一個(gè):
thread
-
使用SessionFactory中的getCurrentSession();方法.
-
底層就是ThreadLocal.
5、測(cè)試
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的事務(wù)與并發(fā)的測(cè)試類: * @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 // 樂(lè)觀鎖解決丟失更新: 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 // 樂(lè)觀鎖解決丟失更新: 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(); } }總結(jié)
以上是生活随笔為你收集整理的hibernate教程--事务处理详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Lucene教程--维护索引、查询对象和
- 下一篇: 信息系统项目管理知识--信息系统建设