day36 10-Hibernate中的事务:解决丢失更新
生活随笔
收集整理的這篇文章主要介紹了
day36 10-Hibernate中的事务:解决丢失更新
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
演示hibernate如何產(chǎn)生丟失更新的
?丟失更新是怎么玩的?首先兩個(gè)事務(wù)先都把它查出來(lái)。
A事務(wù)里面去修改的數(shù)據(jù)沒(méi)了,被B事務(wù)覆蓋掉了。這是被B事務(wù)提交覆蓋,B事務(wù)回滾也能覆蓋。這就是丟失更新的效果。
悲觀鎖使用了數(shù)據(jù)庫(kù)的鎖機(jī)制,
這就是悲觀鎖的解決方案,但是這種方式并不是特別的好。因?yàn)檫@條記錄被鎖定了,其他人都不能操作這條記錄了。必須等排它鎖被釋放完其他人才能操作,這是悲觀鎖來(lái)解決。
?樂(lè)觀鎖來(lái)解決。
這是關(guān)于session的一些本地操作,一會(huì)我們來(lái)說(shuō)它。
?
樂(lè)觀鎖是怎么做的?相當(dāng)于在我們這里加了一個(gè)版本號(hào)。
<?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"><!-- 如果這里配置了包名下面可以不用寫(xiě) --> <!-- <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"><!-- 配置唯一標(biāo)識(shí) --><id name="cid" column="cid"><generator class="native"/></id><!-- version標(biāo)簽是版本號(hào) --><version name="version"></version><!-- 配置普通屬性 --><property name="cname" column="cname" length="30"/><property name="age" column="age" length="30"/><!-- 建立映射 --><!-- 配置一個(gè)集合 <set>的name Customer對(duì)象中的關(guān)聯(lián)對(duì)象的屬性名稱. --><!-- 這里把級(jí)聯(lián)去掉 要最簡(jiǎn)短的配置 <set name="orders" cascade="save-update" inverse="true"> --> <set name="orders" cascade="save-update" batch-size="2"><!-- <key>標(biāo)簽中column:用來(lái)描述一對(duì)多多的一方的外鍵的名稱. --><key column="cno"></key><!-- 配置一個(gè)<one-to-many>標(biāo)簽中class屬性:訂單的類(lèi)的全路徑 --><!-- <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><!-- 這里要寫(xiě)sql語(yǔ)句<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的事務(wù)管理:* @author zhongzh**/ public class HibernateDemo3 {@Test/** 使用樂(lè)觀鎖解決丟失更新 也需要兩個(gè)事務(wù)同時(shí)操作這條記錄。*/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/** 使用樂(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();}@Test/** 使用悲觀鎖解決丟失更新 底層執(zhí)行的是同一個(gè),只不過(guò)事務(wù)不一樣而已*/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/** * 丟失更新的產(chǎn)生* */public void demo2(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();Customer customer = (Customer) session.get(Customer.class, 3);//再有一個(gè)事務(wù)去更新customer的年齡customer.setAge(30);//持久態(tài)對(duì)象不用手動(dòng)調(diào)update都可以完成更新//System.out.println(customer); tx.commit();session.close();}@Test/** * 丟失更新的產(chǎn)生* */public void demo1(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();Customer customer = (Customer) session.get(Customer.class, 3);//假設(shè)就有一個(gè)事務(wù)在更新這個(gè)customer的名稱customer.setCname("沈明貞");//System.out.println(customer); tx.commit();session.close();} }?
轉(zhuǎn)載于:https://www.cnblogs.com/ZHONGZHENHUA/p/6702654.html
總結(jié)
以上是生活随笔為你收集整理的day36 10-Hibernate中的事务:解决丢失更新的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【leetcode】500. Keybo
- 下一篇: image和TFRecord互相转换