![]() |
|
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、非阻塞算法的思想不单可用于系统底层框架,而且适用于任何地方。
转贴于:Oracle认证考试_考试大