检票,身份验证和交易分界

| 我正在将Wicket与自定义的PageAuthorizationStrategy一起使用,该自定义的PageAuthorizationStrategy可访问数据库以获取有关当前用户的信息,从而获得其访问权限。每个请求都由Spring Open-Session-In-View过滤器包装,以打开/关闭Hibernate会话。 这非常适合读取对​​数据库的访问。但是,无论何时需要进行写入操作,我都会调用服务层,该服务层使用Spring基于注释的事务处理。但我也认为这是导致特定错误的原因:当在请求A中的身份验证期间加载对象,然后在另一个请求B中进行修改,然后移交给请求A中的服务层时,该服务层正在与错误值,因为Hibernate和基础数据库都无法确保隔离。由于我一直在努力解决数据库/事务理论的具体问题,因此,如果此假设已经错误,请更正我。 解决方案的第一个想法是在开始写入事务后立即刷新为身份验证而加载的对象。尽管在身份验证需要同时修改服务要修改的对象时,这会导致问题。当Wicket使用来自表单的更改后的数据填充对象并将其通过Submit方法传递给服务时,尤其会发生这种情况。 因此,执行此操作的正确方法可能是确保将身份验证代码与可能在同一请求期间执行的任何编写代码包装在同一事务中。 我该如何在Wicket中做到“正确”? 编辑:当我意识到当引发异常后事务处理的服务方法回滚时,该问题就成了一个更大的问题,视图层会导致LazyInitializationException。显然,Spring的TransactionManager清除了会话和/或Hibernate / Spring深度中的其他内容出错,因为我可以从数据库中重新加载对象,但是尝试加载该对象中包含的集合会导致上述异常。任何想法如何去做?我想如果有一种优雅的方法来使用“每个请求一个事务”,那一切都将得到解决。     
已邀请:
        这不是Wicket问题,而是数据库/休眠问题。 Hibernate支持乐观策略和悲观策略。 乐观的方法是在实体上添加一个“ 0”字段,刷新刷新时将对其进行验证,如果记录被某人修改,则会导致异常。 悲观方法使用数据库支持来锁定记录,从而避免了并发修改。 两者都有优点和缺点,并且都需要您积极使用这些功能并相应地进行编码以使其正常工作(没有魔力)。 乐观主义者将不得不处理可能出现的异常情况。 悲观主义者将不得不处理竞争和可扩展性问题。 乐观主义者可能必须更改架构结构和/或域模型才能处理某些情况。 悲观主义者在处理该表的更新时必须始终担心锁定(您忘记将其锁定在一个位置,而您刚创建了heisenbug)。 而且NoSQL的人们会告诉他们完全删除关系数据库,并且幸福地生活在没有模式,事务和一致性的情况下(顺便说一句,在大多数情况下这是愚蠢的)。     
        我不确定这是否是Wicket中“正确方法”的问题,我会尝试在服务/道层中解决此问题,有一些可能性,例如: 不要在“实时”中使用OSIV模式获取所需的信息,当在表上使用OSIV来显示项目信息而无需查询数据库时,OSIV会发光 将编辑/更改的属性附加到对象,例如最后一次更改的时间戳,在执行任何写操作之前,您可以检查时间戳并从“未来”中警告/补偿更改     

要回复问题请先登录注册