这个事务为何不起作用

fxgang 2009-04-10 09:15:42
我的数据库为SQL2005 SP1
在数据库中定义了如下的一个表:
CREATE TABLE [dbo].[NsCostRec](
[FStockID] [int] NOT NULL,
[FItemID] [int] NOT NULL,
[FDate] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[FAmount] [decimal](18, 6) NOT NULL,
[FAmount1] [decimal](18, 6) NOT NULL,
[FPreAmount] [decimal](18, 6) NOT NULL,
CONSTRAINT [PK_NsCostRec] PRIMARY KEY CLUSTERED
(
[FStockID] ASC,
[FItemID] ASC,
[FDate] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
--
FStockID,FItemID,FDate为主键
--执行下面一个事务
begin tran
update AXiStockInto set FTheFirstTimeID=2,FTheFirstTimeDate='2009-04-10',FTheFirstTimeTime='08:57:22' where finterid=93
insert into NsCostRec(FStockID, FItemID, FDate, FAmount, FAmount1, FPreAmount) values(1773, 1815, '2009-04-09', 1200.000015, 1200.000000, 0.000000)
insert into NsCostRec(FStockID, FItemID, FDate, FAmount, FAmount1, FPreAmount) values(1773, 1815, '2009-04-09', 1200.000015, 1200.000000, 0.000000)
if @@Error=0
begin
commit tran
end
else
begin
rollback tran
end
出现:
-----------
(1 行受影响)

(1 行受影响)
消息 2627,级别 14,状态 1,第 1 行
违反了 PRIMARY KEY 约束 'PK_NsCostRec'。不能在对象 'dbo.NsCostRec' 中插入重复键。
语句已终止。
----------
的提示
此时我的表中已经被写入了数据,事物并没有回滚。
...全文
117 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ws_hgo 2009-04-29
  • 打赏
  • 举报
回复
A.当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。
B.当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。
如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。
ws_hgo 2009-04-10
  • 打赏
  • 举报
回复
SET XACT_ABORT ON
这个判断如果事物出错自动回滚到当前事务。
ai_li7758521 2009-04-10
  • 打赏
  • 举报
回复
SET XACT_ABORT ON;--添加这条

BEGIN TRANSACTION


A.当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。 
B.当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。
如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。

csdyyr 2009-04-10
  • 打赏
  • 举报
回复
在每一条语句后判断@@error 或者 SET XACT_ABORT ON
mugua604 2009-04-10
  • 打赏
  • 举报
回复

CREATE TABLE [dbo].[NsCostRec](
[FStockID] [int] NOT NULL,
[FItemID] [int] NOT NULL,
[FDate] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[FAmount] [decimal](18, 6) NOT NULL,
[FAmount1] [decimal](18, 6) NOT NULL,
[FPreAmount] [decimal](18, 6) NOT NULL,
CONSTRAINT [PK_NsCostRec] PRIMARY KEY CLUSTERED
(
[FStockID] ASC,
[FItemID] ASC,
[FDate] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
--
FStockID,FItemID,FDate为主键
--执行下面一个事务
begin tran
update AXiStockInto set FTheFirstTimeID=2,FTheFirstTimeDate='2009-04-10',FTheFirstTimeTime='08:57:22' where finterid=93
if @@Error=0
begin
end
else
begin
rollback tran
end

insert into NsCostRec(FStockID, FItemID, FDate, FAmount, FAmount1, FPreAmount) values(1773, 1815, '2009-04-09', 1200.000015, 1200.000000, 0.000000)
if @@Error=0
begin
end
else
begin
rollback tran
end

insert into NsCostRec(FStockID, FItemID, FDate, FAmount, FAmount1, FPreAmount) values(1773, 1815, '2009-04-09', 1200.000015, 1200.000000, 0.000000)
if @@Error=0
begin
end
else
begin
rollback tran
end
commit tran
Novelty 2009-04-10
  • 打赏
  • 举报
回复
SQL2005建议用try...catch...来处理。
rucypli 2009-04-10
  • 打赏
  • 举报
回复
SET XACT_ABORT { ON | OFF }
指定当 Transact-SQL 语句出现运行时错误时,SQL Server 是否自动回滚到当前事务。
mugua604 2009-04-10
  • 打赏
  • 举报
回复

CREATE TABLE [dbo].[NsCostRec](
[FStockID] [int] NOT NULL,
[FItemID] [int] NOT NULL,
[FDate] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[FAmount] [decimal](18, 6) NOT NULL,
[FAmount1] [decimal](18, 6) NOT NULL,
[FPreAmount] [decimal](18, 6) NOT NULL,
CONSTRAINT [PK_NsCostRec] PRIMARY KEY CLUSTERED
(
[FStockID] ASC,
[FItemID] ASC,
[FDate] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
--
FStockID,FItemID,FDate为主键
--执行下面一个事务
begin tran
update AXiStockInto set FTheFirstTimeID=2,FTheFirstTimeDate='2009-04-10',FTheFirstTimeTime='08:57:22' where finterid=93
if @@Error=0
begin
commit tran
end
else
begin
rollback tran
end

insert into NsCostRec(FStockID, FItemID, FDate, FAmount, FAmount1, FPreAmount) values(1773, 1815, '2009-04-09', 1200.000015, 1200.000000, 0.000000)
if @@Error=0
begin
commit tran
end
else
begin
rollback tran
end

insert into NsCostRec(FStockID, FItemID, FDate, FAmount, FAmount1, FPreAmount) values(1773, 1815, '2009-04-09', 1200.000015, 1200.000000, 0.000000)
if @@Error=0
begin
commit tran
end
else
begin
rollback tran
end

22,181

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧