zoukankan      html  css  js  c++  java
  • Hibernate 再接触 悲观锁和乐观锁

    为什么取1248

    二进制

    CRUD

    移位效率高

    在并发和效率选择一个平衡点

    一般不会考虑幻读 因为我们不会再一个事务里查询两次,(只能设置为seralizable)

    悲观锁和乐观锁的前提是read-uncommitted

    在数据库中 默认是repeatable read

    悲观锁是想着总有人要更改 所以使用数据库的锁

    乐观锁是在程序级别的 设置一个版本号 如果前后不一致就进行自己的操作

    例子

    悲观所

    Acocount

    package com.bjsxt.hibernate;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    public class Account {
        private int id;
        private int balance; //BigDecimal
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public int getBalance() {
            return balance;
        }
        public void setBalance(int balance) {
            this.balance = balance;
        }
        
        
    }

    Test

        @Test
        public void testSave() {
            Session session = sf.openSession();
            session.beginTransaction();
            
            Account a = new Account();
            a.setBalance(100);
            session.save(a);
                
            session.getTransaction().commit();
            session.close();
        }
        
        @Test
        public void testOperation1() {
            Session session = sf.openSession();
            session.beginTransaction();
            
            Account a = (Account)session.load(Account.class, 1);
            int balance = a.getBalance();
            //do some caculations
            balance = balance - 10;
            a.setBalance(balance);
            session.getTransaction().commit();
            session.close();
        }
        
        @Test
        public void testPessimisticLock() {
            Session session = sf.openSession();
            session.beginTransaction();
            
            Account a = (Account)session.load(Account.class, 1, LockMode.UPGRADE);   //设置数据库锁 不让其他事务访问
            int balance = a.getBalance();
            //do some caculation
            balance = balance - 10;
            a.setBalance(balance);
            session.getTransaction().commit();
            session.close();
        }
        

    乐观锁

    Account

    package com.bjsxt.hibernate;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Version;          //注意:Version 不用自己设置
    
    @Entity
    public class Account {
        private int id;
        private int balance;
        private int version;
        @Version
        public int getVersion() {
            return version;
        }
        public void setVersion(int version) {
            this.version = version;
        }
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public int getBalance() {
            return balance;
        }
        public void setBalance(int balance) {
            this.balance = balance;
        }
        
        
    }
        @Test
        public void testSchemaExport() {
            new SchemaExport(new AnnotationConfiguration().configure()).create(
                    false, true);
        }
    
        @Test
        public void testSave() {
            Session session = sf.openSession();
            session.beginTransaction();
    
            Account a = new Account();
            a.setBalance(100);
            session.save(a);
    
            session.getTransaction().commit();
            session.close();
        }
    
        @Test
        public void testOptimisticLock() {
            Session session = sf.openSession();
    
            Session session2 = sf.openSession();
    
            
            
            
            session.beginTransaction();
            Account a1 = (Account) session.load(Account.class, 1);
            
    
            session2.beginTransaction();
            Account a2 = (Account) session2.load(Account.class, 1);   //Version不用自己设置
            
            a1.setBalance(900);
            a2.setBalance(1100);
    
            session.getTransaction().commit();
            System.out.println(a1.getVersion());
    
            session2.getTransaction().commit();
            System.out.println(a2.getVersion());
    
            session.close();
            session2.close();
        }
  • 相关阅读:
    LeetCode 811. Subdomain Visit Count (子域名访问计数)
    LeetCode 884. Uncommon Words from Two Sentences (两句话中的不常见单词)
    LeetCode 939. Minimum Area Rectangle (最小面积矩形)
    LeetCode 781. Rabbits in Forest (森林中的兔子)
    LeetCode 739. Daily Temperatures (每日温度)
    三种方式实现按钮的点击事件
    239. Sliding Window Maximum
    14.TCP的坚持定时器和保活定时器
    13.TCP的超时与重传
    12.TCP的成块数据流
  • 原文地址:https://www.cnblogs.com/frankzone/p/9607307.html
Copyright © 2011-2022 走看看