我现在正在阅读这本书Spring Recipes,并且对一件事情感到困惑:任何异常都被抛出作为DataAccessException的子类,一个你不想尝试/捕获的RuntimeException。
我担心的是更有可能发生的问题,尤其是插入时。如果您正在使用类似SimpleJdbcTemplate的东西,则每个查询都是它自己的事务,因此您无法确保表中没有密钥然后使用getSimpleJdbcTemplare.update()进行插入,因为密钥可能已插入到两个查询之间
显然,这是一个人们想要比生产系统中的RuntimeException更优雅地处理的东西。那么你如何应对呢?
感谢。
答案 0 :(得分:2)
你不想要的RuntimeException 尝试/捕获
说谁?你没有拥有来捕捉RuntimeException
,但没有什么可以阻止你这样做,这是完全可以接受的。例如,有一个名为DataAccessException
的{{1}}的子类,它专门用于捕获,以便可以尝试重试。还有RecoverableDataAccessException
,它解决了由于乐观锁定导致的下一个事务冲突点,也可以由应用程序专门捕获和处理。
如果你正在使用类似的东西 SimpleJdbcTemplate每个查询都是它的 自己的交易
不正确。如果您使用Spring的transactional semantics,那么OptimisticLockingFailureException
(或您使用的任何DAO组件)将参与事务,如果数据库和事务管理支持它(最应该),则具有完整的ACID语义。对于您的示例,您可以在一个事务中执行SimpleJdbcTemplate
(或数据库支持的任何内容)跟随select for update
。
Spring的数据访问层可能是它的最佳功能,但它很少得到它的信任。