这里可能有很多技术和概念在起作用,当您开始考虑多线程/多请求应用程序时,事情就会变得相当棘手。
正如Iassevk所说,您应该研究使用事务来确保更新的原子性-
一个非常低级的示例是按照以下方式进行 *** 作:
...con.setAutoCommit(false);try { while (rs.next()) { if (conditions_to_update) { rs.updateString(...); rs.updateRow(); } } con.setAutoCommit(true);} catch (Exception ex) { //log the exception and rollback con.rollback();} finally { con.close();}
然后将所有更新批处理到同一事务中。如果任何更新生成异常(例如无效值或连接在结果中途出现故障),则将全部回滚。(最后添加,因为我是它的冠军; p)
但是,这不会解决您的第二个问题,即两个试图更新同一张表的竞争方法-竞争条件。我认为这里有两种主要方法-每种方法各有优缺点。
最简单的方法是锁定表
-这将需要最少的代码更改,但有很大的缺点。与大多数应用程序一样,假设写的更多:读表:锁定表将阻止所有其他用户查看数据,并且代码可能会挂起,等待连接超时之前释放锁踢并引发异常。
更复杂的方法是确保以线程安全的方式实现执行这些更新的方法。为此:
- 该表的所有更新都通过单个类
- 该类实现Singleton模式,或将update方法公开为Static方法
- 更新方法利用Synchronized关键字来防止出现竞争情况
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)