首页 > 解决方案 > Oracle DB,交易中的库存库存量变化

问题描述

我正在为使用 Oracle 的项目开发一些功能。我有两个表InventoryTransaction,其中Inventory表有项目行,每个项目都有一个IDCount,比如:ID = 'ProductA' Count = 12

Transaction表有几行事务,有一个TXID, ItemID, ItemQuantity, 像 :TXID = '00012', ItemID = 'ProductA', ItemQuantity = 5

我需要能够Inventory在进行新交易时更新项目计数。

我可以用多个语句来做到这一点,

INSERT INTO "TRANSACTION"
(TRANSACTIONID ....
VALUES('00012' .....`

UPDATE INVENTORY
SET  Count = Count - ItemQuantity
WHERE ROWID='ProductA'

`

但这似乎不正确,如果出现一些错误并且并非所有语句都执行怎么办。

我应该为这种类型的功能使用什么样的格式?

标签: phpsqloracle

解决方案


听起来很像您想使用 SQL “事务”

例如:

-- In Oracle, this begins an implicit transaction
INSERT INTO "TRANSACTION"(TRANSACTIONID ....) VALUES('00012 .....)
UPDATE INVENTORY SET  Count = Count - ItemQuantity WHERE ROWID='ProductA'
COMMIT

为此,您需要“ItemQuantity”作为某种变量。我想您正在从 PHP 中读取它:您可以从使用 PHP 变量开始。

更好的是,考虑使用Prepared Statements和/或Stored Procedures

您还可以考虑将“TRANSACTIONID”配置为Identity Column

附加信息:

事务是包含一个或多个 SQL 语句的逻辑原子工作单元。

事务对 SQL 语句进行分组,以便它们要么全部提交,这意味着它们被应用到数据库,要么全部回滚,这意味着它们从数据库中撤消。Oracle 数据库为每个事务分配一个唯一标识符,称为事务 ID。

所有 Oracle 事务都遵循数据库事务的基本属性,称为 ACID 属性

事务从第一个可执行的 SQL 语句开始。事务在提交或回滚时结束,可以使用 COMMIT 或 ROLLBACK 语句显式地结束,也可以在发出 DDL 语句时隐式地结束。


推荐阅读