表锁定事务,删除然后插入相同的事务

时间:2013-06-20 19:06:22

标签: php sql sql-server transactions

更新了问题

所以我进一步调试了这个问题,我的代码现在看起来像这样:

$mssql->beginTransaction();
$mssql->sql("DELETE FROM [TABLE] WHERE [FIELD] = 'Test'");
// Write the result from the above query,
// this will confirm the row was deleted
print_r($mssql->result);

$mssql->sql("SELECT FROM [TABLE] WHERE [FIELD] = 'Test'");
// Write the result from the above query,
// this SHOULD be empty as the row was just deleted
print_r($mssql->result);
$mssql->endTransaction();

上述脚本在一个SQL Server数据库上完全可以正常工作,但在另一个SQL Server数据库上(不同服务器上的重复数据库),它不起作用。

第二个数据库设法从表中检索一行,即使该行应该刚被删除...

其他信息

  1. 从我所看到的,数据库选项的唯一区别是Broker Enabled选项,我认为这与此无关。
  2. 我不知道如何访问或查看交易选项,这些是否相关?
  3. 这可能与表锁定有关吗?
  4. SQL跟踪

    declare @p1 int
    set @p1=1
    exec sp_prepexec @p1 output,N'@P1 nvarchar(6)',N'DELETE FROM TABLE WHERE [FIELD]=@P1',N'M87996'
    select @p1
    go
    declare @p1 int
    set @p1=2
    exec sp_prepexec @p1 output,NULL,N'SELECT db_name()'
    select @p1
    go
    exec sp_unprepare 2
    go
    exec sp_unprepare 1
    go
    declare @p1 int
    set @p1=1
    exec sp_prepexec @p1 output,N'@P1 nvarchar(6)',N'SELECT * FROM [TABLE] WHERE [FIELD]=@P1 ',N'M87996'
    select @p1
    go
    exec sp_unprepare 1
    go
    

    原始问题

    这是我第一次使用SQL Transactions,所以如果我天真,我会道歉。

    我有一个事务从数据库中删除一个项目,然后在同一个主键下插入更新的项目。

    考虑以下内容(忽略我的包装类函数):

    $mssql->beginTransaction();
    $mssql->sql("DELETE FROM [TABLE] WHERE [FIELD] = 'Test'");
    $mssql->sql("INSERT INTO [TABLE] ([FIELD]) VALUES ('Test'));
    $mssql->endTransaction();
    

    但是,由于上述原因,我收到Duplicate Primary Key错误。那是因为它还没有提交第一个查询吗?

    因此,不可能在同一个交易中同时拥有上述两个查询吗?

    我无法使用简单的UPDATE命令执行上述操作,因为我必须删除某些行,并且无法知道要删除哪些行...

1 个答案:

答案 0 :(得分:3)

不,它一定是别的东西在起作用。您不必在同一事务中提交,您将始终看到自己的更改,因此在INSERT启动时DELETE已经完成。

首先认为你必须验证DELETE是否真的删除了该行。它可能无法与WHERE子句匹配(即删除0行,检查PDO::exec的返回)。这可以通过与VARCHAR与NVARCHAR(Ascii与Unicode)相结合的一些整理问题来解释。很难猜到。