4

更新的问题

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

$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 数据库上绝对完美,但在另一个(不同服务器上的重复数据库)上,它不起作用。

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

附加信息

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

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 事务,所以如果我太天真了,我深表歉意。

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

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

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

但是,根据上述情况,我遇到了Duplicate Primary Key错误。那是因为它没有提交第一个查询吗?

因此,是否不可能在同一事务中同时拥有上述两个查询?

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

4

1 回答 1

3

不,一定是另有原因。您不必提交,在同一个事务中您将始终看到您自己的更改,因此在您开始 INSERT 时 DELETE 已经完成。

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

于 2013-06-20T19:13:37.773 回答