非阻塞算法思想在数据库开发中的应用

时间:2007-11-26 15:29:09  来源:站长资讯收集整理  作者:

  例二 使用CAS读取并且删除数据表中最小的值的一行

  public Long compareAndDelete(Connection conn) throws Exception {
  for (;;) { //外循环
  Long minValue = null;
  // 读取最小值
  String sql = "SELECT MIN(FVALUE) FROM T";
  PreparedStatement stmt = conn.prepareStatement(sql);
  ResultSet rs = stmt.executeQuery();
  if (rs.next()) minValue = rs.getLong(1);
  rs.close();
  stmt.close();
  if (minValue == null) return null;
  // 比较删除
  sql = "DELETE FROM T WHERE FVALUE = ?";
  stmt = conn.prepareStatement(sql);
  stmt.setLong(1, minValue.longValue());
  int updateCount = stmt.executeUpdate();
  stmt.close();
  // 如果updateCount > 0,删除成功,返回退出循环,否则回退重来
  if (updateCount > 0) return minValue;
  }
  }

  在例二的场景中,使用事务还不好实现,因为Oracle中使用了MIN函数就不能使用 FOR UPDATE。

  性能比较

  在Oracle 10g上作测试,使用CAS的方式测试例一,在10个线程并发测试跑1000次,CAS的方式会比使用事务的方式快10~20。如果加大线程跑并发,CAS的性能逐渐下降,也符合CAS算法在激烈竞争下性能不高的场景。但是实际环境中,很少会在同一点上存在激烈竞争,所以采用CAS的方式会比使用事务的方式效率更高。

  总结

  1、在关系数据库开发中使用非阻塞算法,由于非阻塞算法自身保证原子性,所以不能在嵌套在事务中使用。

  2、使用非阻塞算法不使用事务,不适用悲观的独占锁,不存在激烈竞争的情况下,性能比采用事务的方式性能更好。

  3、非阻塞关系数据库算法,适用于分布式工作流系统、后台调度程序等场景,能够在并发和集群环境下工作良好。

  4、非阻塞算法的思想不单可用于系统底层框架,而且适用于任何地方。

文章评论

共有 位CH网友发表了评论 查看完整内容