如何避免和记录db的一些意想不到的事情?

时间:2011-08-27 13:18:31

标签: php mysql database codeigniter consistency

例如,用户创建产品,并将其分配到类别中。

在类别中,我们有一些记录:

-phone, id:0
-computer, id:1
-pad, id:2

并且用户创建产品,产品需要分配类别,用户执行以下操作:

name:iphone
cat:0

流程将如下工作:

1.  check the cat is exist in db or not
2a. if not exist prompt error 
2b. if exist, put the record in db. 

但是在完成第1步检查之后,在2b开始之前是否有任何机会。管理员删除手机类别。如果发生这种情况,数据库将插入一个没有cat id watch的记录。数据库将具有以下内容:

*-phone, id:0* (not any more, because the admin delete it)
-computer, id:1
-pad, id:2

但是有一个这样的记录:

name:iphone //but it belong to no category, because the admin delete it. 
cat:0

如果有机会这样做,我该如何避免这种情况?谢谢。

(使用php和mysql与codeigniter)

2 个答案:

答案 0 :(得分:1)

你应该考虑两件事:

  1. Transactions - 他们将所有更改都设置为原子,即在您提交之前,所有更改都不会对其他用户可见,因此每个人都会看到数据库处于一致状态。
  2. 修改您的数据库架构以使用foreign keys - 它们确保保持数据关系,因此如果您设置它以使该类别必须始终存在且它突然消失,那么您的插入将失败。

答案 1 :(得分:0)

把它放在一个try .. catch块中,并将MySQL中的一些记录值设为非null( required 的字段),你将能够捕获异常并显示错误。