Bob*_*her 1 java concurrency thread-safety java.util.concurrent
我需要处理检索挂起的记录,并将它们更新为工作单元的“处理中”状态。我想确保下面的代码支持并发,其他线程要等到我当前的线程处理完毕。实现此目标的最佳方法是什么?
public Collection<Object> processPendingMessages() {
    Collection<Object> messages = null;
    //Retrieve pending messages
    messages = messageDAO.getPendingMessages(Direction.INBOUND);
    //Update pending messages to Inprocess
    if (messages!=null && messages.size()>0) {
        messageDAO.updateMessagesToInprocess(messages); 
    } 
    return messages;
}
Run Code Online (Sandbox Code Playgroud)
非常感谢您的投入。谢谢。
您不想通过使用(同步)在jvm级别上单独处理DBAccess并发。在您的情况下,仅在jvm级别进行同步是无法访问数据库的。您还需要按以下方式在数据库连接级别上处理并发性。就DBaccess而言,您还没有提到DAO层中的实现类型,但是无论如何,对于实现而言,以下JDBC隔离级别都应该对您的实现有意义(无论是JDBC,JPA还是Hibernate或EJB等)。通读下面的隔离级别,并确定哪一个适合您的应用程序。实施过程中一切顺利。
事务隔离级别指定哪些数据对事务内的语句可见,作为事务单位。这些级别通过定义针对同一目标数据源的事务之间可能进行的交互,直接影响并发访问的级别。
数据库异常是生成的结果,从单个事务的范围看时似乎是不正确的,但是从所有事务的范围看时是正确的。不同类型的数据库异常描述如下:
在以下情况下发生脏读: 事务A在表中插入一行。事务B读取新行。事务A回滚。事务B可能已经基于事务A插入的行完成了对系统的工作,但是该行从未成为数据库的永久部分。
在以下情况下发生不可重复的读取: 事务A读取一行。事务B更改行。事务A再次读取同一行并获得新结果。
在以下情况下会发生幻像读取: 事务A读取SQL查询上满足WHERE子句的所有行。事务B插入满足WHERE子句的另一行。事务A重新评估WHERE条件,并选择其他行。
JDBC_TRANSACTION_NONE这是一个特殊的常量,指示JDBC驱动程序不支持事务。
JDBC_TRANSACTION_READ_UNCOMMITTED此级别允许事务查看未提交的数据更改。在此级别上,所有数据库异常都是可能的。
JDBC_TRANSACTION_READ_COMMITTED在事务内部进行的任何更改在提交事务之前都不在其外部可见。这样可以防止脏读。
读取的JDBC_TRANSACTION_REPEATABLE_READ行将保留锁,以便在事务未完成时另一个事务无法更改它们。这不允许脏读和不可重复读。幻像读取仍然是可能的。
JDBC_TRANSACTION_SERIALIZABLE表已为该事务锁定,因此其他向该表添加值或从中删除值的事务无法更改WHERE条件。这样可以防止所有类型的数据库异常。
该setTransactionIsolation方法可以被用来改变要连接的事务隔离等级。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           3176 次  |  
        
|   最近记录:  |