如何通过Hibernate在java中使用数据库时锁定对数据库的访问?
我使用JPA/HIBERNATE来管理我的mysql数据库(读写),其他应用程序也使用相同的数据库(只读)。 我想做的是:当我在java(hibernate)中编辑db时,我希望所有其他应用程序都能读取旧值,当我的程序完成时,我想切换到程序修改的新值 我该怎么做 这是密码如何通过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();
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();
}
您描述的内容涉及设置适当的隔离级别 有四种不同类型的隔离级别:
- 读未提交
- 阅读承诺
- 可重复读取
- 可序列化
可重复读取和已提交读取之间的区别在于,MySQL将保留读取锁,直到事务结束,而其他数据库将立即释放资源上的读取锁。换句话说,如果读应用程序执行长时间运行的事务,其他应用程序的读操作可能会影响您在写应用程序中的写能力,反之亦然。请共享您迄今为止使用过的任何代码。请参见此处:我加入了一个操纵数据库的代码示例。谢谢,我应该在hibernate的属性中添加该属性吗?隔离级别可以在数据库中配置(如果要更改整个数据库的全局状态),也可以在创建数据库时在单个事务中配置。这是独立于hibernate的。谢谢,非常有用!