任务
用户每天只能在网站上收集 ONE 奖励 ONCE 。
服务器结构:
这两个Web服务器使用相同的代码进行部署,并连接到同一个数据库。
请求被随机定向到其中一个Web服务器。
我有什么
我编写了整个业务逻辑,在一个过程中检查这是用户当天的第一个请求,该用户是否合法等。
我在Spring Framework中使用@Transactional
,希望能够在DB中编写事务处理过程。
问题
用户同时发送了10,000个请求,其中两个被定向到两个不同的服务器并同时调用该过程,这意味着用户今天收到了两个奖金。
帮助
所以,根据我的理解,Spring Framework中的@Transactional
会阻止代码访问数据库,而不是直接阻止数据库访问?当服务器B运行使用@Transactional
注释的方法时,服务器A的用户仍然可以访问数据库中的表吗?
而且,如何在Oracle中的存储过程中使用事务?
提前致谢。
答案 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/