我的web应用程序存在一些并发问题,其中有一个对数据库的写入,并且可能同时进行读取。写入首先删除所有行,然后插入新行,因此有可能在数据库为空时完成读取,从而导致错误。我正在使用ReentrantReadWriteLock,但希望确保正确使用它。如有任何解决办法,将不胜感激。
private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public static Schedule lookupSchedule()
{
lock.readLock().lock();
try
{
// read data from the database, manipulate it, return it
}
finally
{
lock.readLock().unlock();
}
}
public static void setSchedule()
{
Connection conn = DB.getConnection();
lock.writeLock.lock();
try
{
conn.openTransaction();
// delete all the rows from the table
// insert all the new rows into the table
conn.committTransaction();
}
catch (Exception ex)
{
conn.rollbackTransaction();
}
finally
{
lock.writeLock.unlock();
}
}发布于 2014-05-21 15:12:34
就问题而言:您对ReentrantReadWriteLock的使用是正确的。
关于您的问题:我认为您需要考虑有效的事务隔离级别(并可能调整它)。
希望这能帮上忙。
隔离级别在另一个SO线程中的解释:what is difference between non-repeatable read and phantom read?
关于隔离级别的Java教程一章:integrity
https://stackoverflow.com/questions/23786130
复制相似问题