如何通过Hibernate在java中使用数据库时锁定对数据库的访问?

如何通过Hibernate在java中使用数据库时锁定对数据库的访问?,java,mysql,database,hibernate,jpa,Java,Mysql,Database,Hibernate,Jpa,我使用JPA/HIBERNATE来管理我的mysql数据库(读写),其他应用程序也使用相同的数据库(只读)。 我想做的是:当我在java(hibernate)中编辑db时,我希望所有其他应用程序都能读取旧值,当我的程序完成时,我想切换到程序修改的新值 我该怎么做 这是密码 public static Integer (Equipment equipment) { Session session = factory.openSession();

我使用JPA/HIBERNATE来管理我的mysql数据库(读写),其他应用程序也使用相同的数据库(只读)。 我想做的是:当我在java(hibernate)中编辑db时,我希望所有其他应用程序都能读取旧值,当我的程序完成时,我想切换到程序修改的新值

我该怎么做

这是密码

public static Integer  (Equipment equipment)
         {
             Session session = factory.openSession();
             Transaction tx = null;
             Integer equipementID = null;
             try{
                 tx = session.beginTransaction();
                 equipementID = (Integer) session.save(equipment); 
                 tx.commit();
             }catch (ConstraintViolationException e) {
                 if (tx!=null) tx.rollback();
             }finally {
             }
             return equipementID;
         }


    public static void parseFile (String filePath1) throws IOException
           {
             Scanner s1 = new Scanner(new File(filePath1));
             s1.useDelimiter("\\s*fish\\s*");

             while (s1.hasNextLine())
             {
                Scanner s2 = new Scanner (s1.nextLine()); 
                s2.useDelimiter(";");

                while (s2.hasNext()) {
                     String hostName = s2.next();
                     int asNum=s2.nextInt();
                     String type=s2.next();
                     String addrIp=s2.next();
                     String vendor=s2.next();
                     String model=s2.next();
                     String version=s2.next();
                     String function=s2.next();
                     String usage=s2.next();

                     if (asNum==3215)
                         addEquipmentToDatabase(new Equipment(hostName,0,addrIp,"ftipnn",asNum,model,type,vendor,function,usage,version,1,0));
else
                     updateEquipment(equipment,new Equipment(hostName,0,addrIp,"domain",asNum,model,type,vendor,function,usage,version,1,0));
            }


                }
                s2.close();
             }
             s1.close();
           }



    public static void updateEquipment (Equipment actualEquipment,Equipment newEquipment)
        {
            Transaction tx = session.beginTransaction();
            Query query = session.createSQLQuery("UPDATE equipment SET hostName = '"+newEquipment.getHostName()+"',"
                                                                  +"parity= '"+newEquipment.getParity()+"',"
                                                                  +"addrIP= '"+newEquipment.getAddrIP()+"',"
                                                                  +"domainExtension= '"+newEquipment.getDomainExtension()+"',"
                                                                  +"asNum= '"+newEquipment.getAsNum()+"',"
                                                                  +"model= '"+newEquipment.getModel()+"',"
                                                                  +"type= '"+newEquipment.getType()+"',"
                                                                  +"vendor ='"+newEquipment.getVendor()+"',"
                                                                  +"function= '"+newEquipment.getFunction()+"',"
                                                                  +"utilization= '"+newEquipment.getUtilization()+"',"
                                                                  +"version= '"+newEquipment.getVersion()+"',"
                                                                  +"idSite= '"+newEquipment.getIdSite()+"',"
                                                                  +"idProfile= '"+newEquipment.getIdProfile()+"' "+
                                                                  "WHERE hostName LIKE '"+actualEquipment.getHostName()+"'") ;
            query.executeUpdate();
            tx.commit();
        }

您描述的内容涉及设置适当的隔离级别

有四种不同类型的隔离级别:

  • 读未提交
  • 阅读承诺
  • 可重复读取
  • 可序列化
默认情况下,大多数数据库通常执行读提交,这意味着在另一个事务提交其工作之前,其他任何查询都不会看到另一个事务所做的更改,但是允许读取现有数据(无更改的数据)

read committed的缺点是,如果一个事务更改了足够多的行,那么这些锁可能会升级到更高的级别(页面或表),并导致性能瓶颈问题。这就是为什么通常建议在批量操作期间执行小的提交点,以防止表被其他事务锁定

MySQL有点不同,因为它的默认值是可重复读取的


可重复读取和已提交读取之间的区别在于,MySQL将保留读取锁,直到事务结束,而其他数据库将立即释放资源上的读取锁。换句话说,如果读应用程序执行长时间运行的事务,其他应用程序的读操作可能会影响您在写应用程序中的写能力,反之亦然。

请共享您迄今为止使用过的任何代码。请参见此处:我加入了一个操纵数据库的代码示例。谢谢,我应该在hibernate的属性中添加该属性吗?隔离级别可以在数据库中配置(如果要更改整个数据库的全局状态),也可以在创建数据库时在单个事务中配置。这是独立于hibernate的。谢谢,非常有用!