gpt4 book ai didi

sql - 在插入新数据集之前获取表中已有事件的行数?

转载 作者:行者123 更新时间:2023-12-04 05:08:50 25 4
gpt4 key购买 nike

我有一个由三个值组成的表

  • 参会者ID
  • 类(class)事件ID
  • 马克

  • 每个 courseevent , 只允许 15 人

    如何使用 Oracle 进行检查?

    最佳答案

    这个问题最重要的方面是让它在多用户环境中工作。

    Oracle 只允许 READ COMMITTED 和 SERIALIZED 隔离级别。没有幻读或脏读,也没有“窥视”未提交 session 的机制。 Find out more .

    这意味着这个声明

    select courseevent, count(*) 
    from courseparticpants
    group by courseevent;

    将显示已提交的记录数。如果您继续插入记录,您仍然可以插入第十六个预订,如果其他人在此期间提交了他们的工作。相反,当实际上有人要删除一行时,您可能会认为类(class)已满。

    要控制这一点,您需要序列化对 courseparticpants 的访问。表,以便一次只有一个 session 可以向其中插入记录。有多种方法可以做到这一点,但最安全的是:
    lock table courseparticpants exclusive nowait;

    如果您未能获得锁定,您就知道另一个 session 已经在处理它。否则,您可以运行您的计数,插入新的预订,并在确保您的规则没有被破坏的情况下进行任何其他需要的操作。

    重要的是不要因为太锁而卡住在锁上,原因很明显:没有其他人可以在 table 上做他们的工作。稍微不那么突兀的机制是锁定父表中的相关记录;我没有首先提出这个,因为我不想对你的数据模型做出假设。
    select whatever
    from courseevents
    where courseevent = :p1
    for update nowait;

    这将允许其他 session 为另一个事件预订参与者。 Find out more .

    这两种解决方案都需要编写一个程序单元——比如在 PL/SQL 中——来管理事务。

    "is there a possibility to solve this with constraints?"



    不,Oracle 不允许在其 CHECK 约束中使用 SQL。标准 SQL 具有断言的概念,但 Oracle 尚未实现它们。

    一种可能的解决方案是使 participantid courseevent 内的计数,因此您可以强制执行检查约束
    check ( participantid <= 15)

    但是,您仍然需要执行所有锁定和其他操作才能获得当前参与者数量的准确数字,以便您的 n+1是正确的。

    关于sql - 在插入新数据集之前获取表中已有事件的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15150244/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com