当前位置: 首页 > 面试题库 >

在保留在oracle数据库中的同时处理并发请求?

梁宪
2023-03-14
问题内容

我有这种情况,在航空公司网站(使用Java)上,两个单独的客户同时发送两个请求,以预订
从纽约到芝加哥的同一家航空公司的同一座位。我正在使用oracle数据库,并且隔离级别已读为已提交。
我的问题是,oracle数据库是否提供任何解决此类并发情况的解决方案?
我知道的是,当第一个事务DML语句被触发时,它将获得对受影响的行的锁定,并在事务完成时即发出回滚或提交时释放。但是一旦提交完成,第二个请求将在第一个请求完成时立即进行并将覆盖第一个。
这样做没有帮助吗?

是的,在Java中,我可以将db类设置为单例,并在进行更新的方法上使用synced关键字。
但是想知道到底有什么问题可以在数据库级别本身解决吗?可能是隔离级别,因为可序列化可以提供帮助。 但是不确定吗?


问题答案:

要在网站上处理并发,通常的做法是在每条记录上都有一列,以便您检查自获得以来是否未更新。上次更新日期或顺序版本号(由触发器自动递增)。

通常,您将读取数据(加上并发列)

SELECT seat,etc,version_no
FROM t1
WHERE column = a_value

然后,当用户最终准备预订座位时,除非有更新,否则更新将起作用。

(版本号或更新日期将在每次更新后更改)

BEGIN
    UPDATE t1
    SET seatTaken = true
    WHERE seatid = .....
    AND version_no = p_version
    RETURNING version_no INTO p_version;
EXCEPTION WHEN NOT_FOUND THEN
    --Generate a custom exception 
    --concurrency viloation the record has been updated already
END;

自动更新版本号的触发器看起来像这样

CREATE OR REPLACE TRIGGER t1_version
AFTER INSERT OR UPDATE ON t1
FOR EACH ROW
BEGIN
    IF :new.version_no IS NULL THEN
       :new.version_no  := 0;
    ELSE
       :new.version_no  := :old.version_no  + 1;
    END IF;
END;


 类似资料:
  • 我尝试实现Spring Batch。在这里,我试图将数据从文本文件保存到数据库中。我在处理的时候得到了NPE。 在这里,我使用JPARepository将文本文件数据保存到自定义writer类中的数据库中。此处StudentRepo为空。 为什么是空的?我尝试了另一种方法,用同样的方法手工存储在数据库中,没有问题。只有在writer类中,它是空的。

  • 我在oracle DB中创建了示例表,如下所示 和从java插入的值如下所示 亚洲/加尔各答的JVM时区。我使用SQL developer查询数据。我只是想澄清我的理解 我在下面的文章中提到了,但我的观察看起来完全不同。http://brian.pontarelli.com/2011/08/16/时区数据库处理/

  • 问题内容: 我已经使用gps设备捕获了一个图的四个点(坐标)。 点1:-lat- 27.54798833长-80.16397166 点2:-lat 27.547766,长-80.16450166 点3:-lat 27.548131,长-80.164701 点4:---- 现在我想将这些坐标保存在oracle数据库中,并将其另存为多边形。 谢谢 问题答案: 如果打算使用Oracle Spatial来

  • 问题内容: 我当前正在使用一个Web应用程序,每次都调用此Web应用程序,请删除所有当前的Express会话,因此我需要一种方法来保留所有这些会话。我试图用connect- mongodb和connect- redis保留所有这些会话,但是都无效,nodemon总是说req.session是未定义的。我不知道该怎么做才能保留所有会话。 我需要一种方法来保留所有会话,执行时不要丢失它们,并为其提供教

  • 问题内容: 我正在几个平台上尝试并发请求处理。 实验的目的是对某些选定技术的能力范围进行 广泛的 测量。 我成立了一个Linux VM我的机器上有一个基本的围棋http服务器(香草中的默认包)。然后,服务器将计算 fasta 算法的修改版本,该版本将线程和进程限制为1,并返回结果。N设置为100000。该算法运行大约2秒钟。我在Google App Engine项目上使用了 相同的 算法和逻辑。

  • 问题内容: 如果创建Oracle dblink,则无法直接访问目标表中的LOB列。 例如,使用以下命令创建一个dblink: 之后,您可以执行以下操作: 除非该列是LOB,否则您将收到错误: 这是有据可查的限制。 同一页上建议您将值提取到本地表中,但这有点…杂乱无章: 还有其他想法吗? 问题答案: 是的,这很混乱,不过我想不出办法避免这种情况。 您可以通过将临时表创建放入存储过程中(并使用“立即执