【问题标题】:Duplicate Insert in transaction在事务中重复插入
【发布时间】:2016-01-22 06:48:51
【问题描述】:

我有一个场景,即使执行了检查,我也将多条记录插入到表中,我解释下面的代码流程。

BEGIN Transection;
var model = select id from table1 where outlet_code = 123 and survey_id = 5
if(model){
     throw new Exception("Outlet is already Surveyed.");
}else{
     INSERT Record into the table
} 
Commit Transection;

问题: 我从移动端收到多个上传调查的请求,但是当我收到多个具有相同插座代码的请求时会出现问题。

First  Request outlet_code = 123abc and survey_id = 5
Second Request outlet_code = 123abc and survey_id = 5

重点是不应将第二个请求插入代码中,但在某些情况下,两条记录都会插入到“table1”中

我测试了这个场景,但是我得到了一个很好的异常,但是数据库中有违反这个条件的记录,我在数据库中得到了两条记录

请提出我做错了什么,我只是知道这可能是事务提交顺序的问题,但我不知道如何解决这种情况。

数据库是 SQL server 2008。

【问题讨论】:

  • PRIMARY KEY WITH(IGNORE_DUP_KEY=ON) ?
  • 你正在使用什么数据库 1.) mysql 2.) postgresql 或 ????
  • 如果您使用的是 postgresql,则使用:UPSERT:如果数据已经退出,它将修改,否则将插入表中

标签: php sql sql-server database sqltransaction


【解决方案1】:

最简单和最干净的方法是在 ID 列上创建一个主键,这样表就不会接受任何具有重复 ID 的插入。这将在第二次插入时引发错误,因此也应进行处理。

【讨论】:

  • 实际上有三列 id -- pk outlet_code --- varcharsurvey_id ------ varchar id 是自动递增的,我唯一不想要的是另一条具有相同surevey_id 和相同 outlet_code 的记录
  • 然后在这些列上创建一个唯一约束: ALTER TABLE table_name ADD CONSTRAINT constr_name UNIQUE(outlet_code,surevey_id); --不确定这在 sql-server 中是否完全相同,但你明白了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多