Oracle 中的事务和过程

Transaction and Procedure in Oracle

任务

用户每天只能在网站上领取 ONE 次奖金 ONCE

服务器结构:

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

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

我有什么

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

我在 Spring 框架中使用 @Transactional,希望使我在数据库中编写的过程具有事务性。

问题

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

帮助

因此,据我了解,Spring 框架中的 @Transactional 会阻止代码访问数据库,但不会直接访问数据库?服务器 A 的用户仍然可以访问数据库中的表,当服务器 B 是 运行 注释方法 @Transactional?

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

提前致谢。

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