Hibernate 乐观锁和悲观锁处理事物并发问题 电玩女神 2022-04-17 01:55 181阅读 0赞 **一、5类事物并发问题** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDY4ODEy_size_16_color_FFFFFF_t_70][] **二、事物的隔离级别** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDY4ODEy_size_16_color_FFFFFF_t_70 1][] **三、处理第一类丢失更新和第二类丢失更新--使用锁机制** 数据库的锁机制: 在MYSQL中 ,为了避免第二类丢失更新出现,提供了悲观锁的机制; SELECT XXX FROM XXX FOR UPDATE; SELECT FOR UPDATE就是在数据上添加一个共享锁的东西; 1,共享锁允许其他普通的SELECT语句执行; 2,共享锁排斥其他的SELECT FOR UPDATE; 3,共享锁排斥INSERT DELETE等DML; 在hibernate中使用悲观锁: 1,session1.createQuery("").setLockOptions(LockOptions.UPGRADE); 2,Account a=(Account)session1.get(Account.class,1L,LockOptions.UPGRADE); 3,Account a=(Account)session1.load(Account.class,1L,LockOptions.UPGRADE); 注意, 使用悲观锁会在一定情况下降低系统的并发性能; 如果系统对数据安全的要求非常高,请使用悲观锁; 乐观锁: 在hibernate中使用乐观锁: 1,在对象中添加一个private int version属性,最好把setter/getter设置为private; 2,在映射文件中添加: 四、例子 @Setter @Getter public class Account implements Serializable { private Long id; private int vesion; private Double balance; } 配置文件 <hibernate-mapping package="com.shenzhenair.day03.Transactions" > <class name="Account"> <id name="id" > <generator class="native"/> </id> <property name="vesion" /> <property name="balance" /> </class> </hibernate-mapping> 测试用例: @Test public void testTransaction(){ Session session1 = HibernateUtils.openSession(); session1.beginTransaction(); Session session2 = HibernateUtils.openSession(); session2.beginTransaction(); Account a = (Account) session1.get(Account.class,1L); Account b = (Account) session2.get(Account.class,1L); a.setBalance(a.getBalance() - 5000); b.setBalance(b.getBalance() + 5000); try { session2.getTransaction().commit(); session1.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); System.out.println("请稍后再进行操作!"); } session2.close(); session1.close(); } ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDY4ODEy_size_16_color_FFFFFF_t_70 2][] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDY4ODEy_size_16_color_FFFFFF_t_70]: /images/20220417/108c42dead334836b64a683a3feafc38.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDY4ODEy_size_16_color_FFFFFF_t_70 1]: /images/20220417/0231f09205a84c5e9d3060da52af8193.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDY4ODEy_size_16_color_FFFFFF_t_70 2]: /images/20220417/7c2a1fe65f13452b819f6f688ac90154.png
还没有评论,来说两句吧...