2016-03-01 109 views
0

林不知道的钥匙复制如果标题描述我的问题, 我有需要使用一个唯一的密钥与每个记录,如下表答:避免数据库插入

1.it从取钥匙表格称为柜台(假设其为500)。 2.it检查表A中是否真的使用了最后一个值(这是因为有人可能预订了该值,然后未完成使用它)(如果使用增量值,否则取值)

商业智能过程通过2个步骤完成: 1.client点击book id,以便他/她拥有密钥。 2.client填补其余的信息并保存,以便新行被插入到表A.

多个客户可能会使用该系统的同时,让他们的拖车可能预定值相同

假设用户1预订500,然后用户2预订500(用户1还没有使用它,所以用户2将采取相同的密钥),然后用户1插入行到表A,然后用户2插入行到表A

这种情况下会导致严重问题,因为两者都使用相同的密钥,应该是唯一的

woul d请为此建议一个解决方案

回答

0

那么我首先会重新考虑你的解决方案的架构,但是因为那个答案太无聊了,所以我也会尝试更具建设性。

你想要看的是“交易”。事务锁定一张表供其他人使用,然后启动交易。这在诸如座位数量有限的预订系统和系统可能缺货的在线商店等解决方案中大量使用。

该理论相当简单,但实现可能需要一些才能正确。你也应该知道,你很可能会在你的一系列ID中出现“漏洞”。这意味着如果用户A的书籍ID 500和用户B的书籍ID 501,然后用户A取消it's预订,而无需创建一个记录将不会有编号500

我觉得我的做法,您的问题将是

1:用户在目标表中创建一条记录,并获得一个正常的主键增量ID。

2:创建并保存记录后,逻辑请求从您描述的ID表中获取“可视”ID。这是通过使用事务来确保可视ID是唯一的。

在实际创建记录之前,您应该没有真正有效的理由来预订/创建ID。

取决于你的环境交易的实施方式不同。例如在MySQL中,你会做这样的事情。

START TRANSACTION; 
SELECT @A:=SUM(salary) FROM table1 WHERE type=1; 
UPDATE table2 SET [email protected] WHERE type=1; 
COMMIT; 

但是,如果您使用的是像Active Record或类似的ORM应该有一个方便的方法。

你也可以通过使用纯SQL脚本来解决这个问题。 I.E:创建一个存储过程来创建记录,并为其获取新的可视ID。您仍然需要使用交易艰难。

+0

非常感谢你,我会考虑这一点 – Heba