日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

day36 10-Hibernate中的事务:解决丢失更新

發(fā)布時(shí)間:2025/6/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。