Oracle中的事务和过程

时间:2015-05-26 03:02:26

标签: java spring oracle stored-procedures transactional

任务

用户每天只能在网站上收集 ONE 奖励 ONCE

服务器结构

  • 两个网络服务器
  • 一个数据库

这两个Web服务器使用相同的代码进行部署,并连接到同一个数据库。

请求被随机定向到其中一个Web服务器。

我有什么

我编写了整个业务逻辑,在一个过程中检查这是用户当天的第一个请求,该用户是否合法等。

我在Spring Framework中使用@Transactional,希望能够在DB中编写事务处理过程。

问题

用户同时发送了10,000个请求,其中两个被定向到两个不同的服务器并同时调用该过程,这意味着用户今天收到了两个奖金。

帮助

所以,根据我的理解,Spring Framework中的@Transactional会阻止代码访问数据库,而不是直接阻止数据库访问?当服务器B运行使用@Transactional注释的方法时,服务器A的用户仍然可以访问数据库中的表吗?

而且,如何在Oracle中的存储过程中使用事务?

提前致谢。

1 个答案:

答案 0 :(得分:0)

与Oracle的每个连接都是一个事务;与SQL Server不同,它需要指定begin trans。如果您有一个直接连接到数据库的Web场/园,并且负载平衡交换机将请求A然后B发送到Web服务器1和2,您将获得针对该数据库的两个事务。默认情况下,Oracle的隔离级别设置为read committed。如果您在存储过程中查询某些内容以检查是否已应用奖励,则您需要选择更新以锁定该行,以便阻止其他事务读取该行,直到另一个事务完成更新。此外,您是否考虑过使用任何会话来保持每个会话对一个Web服务器的粘性?否则,我会考虑在请求发送到数据库之前使用CQRS模式之后的一些中间件代码作为另一种替代方法:http://blog.trifork.com/2010/01/27/cqrs-designing-domain-events/