day36 10-Hibernate中的事务:解决丢失更新
生活随笔
收集整理的這篇文章主要介紹了
day36 10-Hibernate中的事务:解决丢失更新
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
演示hibernate如何產生丟失更新的
?丟失更新是怎么玩的?首先兩個事務先都把它查出來。
A事務里面去修改的數據沒了,被B事務覆蓋掉了。這是被B事務提交覆蓋,B事務回滾也能覆蓋。這就是丟失更新的效果。
悲觀鎖使用了數據庫的鎖機制,
這就是悲觀鎖的解決方案,但是這種方式并不是特別的好。因為這條記錄被鎖定了,其他人都不能操作這條記錄了。必須等排它鎖被釋放完其他人才能操作,這是悲觀鎖來解決。
?樂觀鎖來解決。
這是關于session的一些本地操作,一會我們來說它。
?
樂觀鎖是怎么做的?相當于在我們這里加了一個版本號。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.itcast.vo"><!-- 如果這里配置了包名下面可以不用寫 --> <!-- <hibernate-mapping> --> <!-- <class name="cn.itcast.hibernate3.demo2.Customer" table="customer">--><!-- <class name="cn.itcast.vo.Customer" table="customer">--><class name="Customer" batch-size="2" table="customer"><!-- 配置唯一標識 --><id name="cid" column="cid"><generator class="native"/></id><!-- version標簽是版本號 --><version name="version"></version><!-- 配置普通屬性 --><property name="cname" column="cname" length="30"/><property name="age" column="age" length="30"/><!-- 建立映射 --><!-- 配置一個集合 <set>的name Customer對象中的關聯對象的屬性名稱. --><!-- 這里把級聯去掉 要最簡短的配置 <set name="orders" cascade="save-update" inverse="true"> --> <set name="orders" cascade="save-update" batch-size="2"><!-- <key>標簽中column:用來描述一對多多的一方的外鍵的名稱. --><key column="cno"></key><!-- 配置一個<one-to-many>標簽中class屬性:訂單的類的全路徑 --><!-- <one-to-many class="cn.itcast.hibernate3.demo2.Order"/>--><one-to-many class="cn.itcast.vo.Order"/></set></class><!-- 命名查詢的方式 --><query name="findAll">from Customer </query><!-- 這里要寫sql語句<sql-query></sql-query>--> </hibernate-mapping> package cn.itcast.test;import org.hibernate.LockMode; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test;import cn.itcast.utils.HibernateUtils; import cn.itcast.vo.Customer;/*** * Hibernate的事務管理:* @author zhongzh**/ public class HibernateDemo3 {@Test/** 使用樂觀鎖解決丟失更新 也需要兩個事務同時操作這條記錄。*/public void demo6(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();Customer customer = (Customer) session.get(Customer.class, 3);customer.setAge(26);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();}@Test/** 使用悲觀鎖解決丟失更新 底層執行的是同一個,只不過事務不一樣而已*/public void demo4(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 使用悲觀鎖(排它鎖)@SuppressWarnings("deprecation")Customer customer = (Customer) session.get(Customer.class, 3, LockMode.UPGRADE);customer.setAge(32);tx.commit();session.close();}@Test/** 使用悲觀鎖解決丟失更新*/public void demo3(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 使用悲觀鎖(排它鎖)@SuppressWarnings("deprecation")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的年齡customer.setAge(30);//持久態對象不用手動調update都可以完成更新//System.out.println(customer); 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的名稱customer.setCname("沈明貞");//System.out.println(customer); tx.commit();session.close();} }?
轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/6702654.html
總結
以上是生活随笔為你收集整理的day36 10-Hibernate中的事务:解决丢失更新的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【leetcode】500. Keybo
- 下一篇: image和TFRecord互相转换