zoukankan      html  css  js  c++  java
  • hibernate 悲观锁乐观锁

    悲观锁和乐观锁是:在事务隔离机制中设置了ReadCommited的情况下,两种可以避免不可重复读的方式。

     

    设置成读已提交是考虑到安全和处理速度,保证并发效率,但是在这个情况下仍然需要避免不可重复读这种情况,于是hibernate提供两种锁来解决这个问题。

     

     

     

    悲观锁:自己事务完成之前别人不能动数据。依赖于数据库,“for update”

     

    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;
        }
    }

     

    测试类:

    package com.bjsxt.hibernate;

    import java.math.BigDecimal;

    import org.hibernate.LockMode;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.AnnotationConfiguration;
    import org.hibernate.tool.hbm2ddl.SchemaExport;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;

    public class HibernateCacheTest {
        private static SessionFactory sf;
       
        @BeforeClass
        public static void beforeClass() {
            sf = new AnnotationConfiguration().configure().buildSessionFactory();
        }
        @AfterClass
        public static void afterClass() {
            sf.close();
        }
       
        @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 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);//NOWAIT ORACL支持
            int balance = a.getBalance();
            //do some caculation
            balance = balance - 10;
            a.setBalance(balance);
            session.getTransaction().commit();
            session.close();
        }
       
        public static void main(String[] args) {
            beforeClass();
        }
    }

     

    乐观锁:依赖于表的一个字段,该字段每当该条数据被更新了,字段的内容就会变化而且不会和以前重复。将model中加上@Version即可标记该字段。

     

    package com.bjsxt.hibernate;

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.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;
        }
    }

    测试类:

    package com.bjsxt.hibernate;

    import java.math.BigDecimal;

    import org.hibernate.LockMode;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.AnnotationConfiguration;
    import org.hibernate.tool.hbm2ddl.SchemaExport;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;

    public class HibernateCacheTest {
        private static SessionFactory sf;

        @BeforeClass
        public static void beforeClass() {
            sf = new AnnotationConfiguration().configure().buildSessionFactory();
        }

        @AfterClass
        public static void afterClass() {
            sf.close();
        }

        @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);
           
            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();

        }

        public static void main(String[] args) {
            beforeClass();
        }
    }

  • 相关阅读:
    HDFS文件操作命令手册
    Hadoop——HDFS的构架
    Hadoop运行Jar文件时Output错误
    hadoop中DataNode消失挂掉的原因及解决方法
    MapReduce程序(一)——wordCount
    安装单机Hadoop系统(完整版)——Mac
    决策粗糙集与博弈粗糙集之比较
    关于决策粗糙集(三支决策)、概率粗糙集、博弈粗糙集的一点认识
    LeetCode-Repeated DNA
    生产环境安装centos时的磁盘规划
  • 原文地址:https://www.cnblogs.com/flying607/p/3484241.html
Copyright © 2011-2022 走看看