表结构:
CREATE TABLE [dbo].[t1](
[id] [int] NOT NULL,
[value] [int] NULL,
 CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED 
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]测试一:
BEGIN TRANSACTION 
 insert into t1(id,value)values(2,'1')
 insert into t1(id,value)values(2,'1')
commit TRANSACTION 
结果:
select * from t1
id value
2   1
问题:
为什么还能插入一条记录呢?测试二:
BEGIN TRANSACTION 
insert into t1(id,value)values(2,'1')
insert into t1(id,value1)values(2,'1')  --表中没有value1字段
commit TRANSACTION 
结果:
select * from t1
id value
问题:
为什么没有插入记录?测试三:
BEGIN TRANSACTION 
insert into t1(id,value)values(2,'1')
select id,value1 from t1   --表中没有value1字段
commit TRANSACTION 
结果:
select * from t1
id value
问题:
为什么没有出入记录?测试四:
BEGIN TRANSACTION 
insert into t1(id,value)values(2,'1')
select * from  bb   --bb表不存在
commit TRANSACTION 结果:
select * from t1
id value
2   1
问题:
为什么会茶入记录?

解决方案 »

  1.   

    你的表中value这个数据类型是int 你插入记录时insert into t1(id,value)values(2,'1')错误
    应该是insert into t1(id,value)values(2,1)的吧!!
      

  2.   

    begin tran
    insert into 表
    select '11'
    if @@rowcount>0 and @@error=0
    commit tran
    else
    rollback tran
      

  3.   

    我以为

    bagin tran
    ......
    commit tran
    中的语句如果有错误的话 会全部回滚  ,难道不是这样的吗?
      

  4.   

    显然不是,那还要rollback干吗
      

  5.   

    测试二:
    BEGIN TRANSACTION 
    insert into t1(id,value)values(2,'1')
    insert into t1(id,value1)values(2,'1')  --表中没有value1字段
    commit TRANSACTION 
    结果:
    select * from t1
    id value
    问题:
    为什么没有插入记录?
    这个我也没有rollback  怎么没有插入记录呢
      

  6.   

    BEGIN TRANSACTION 
    ……
    commit TRANSACTION 这是一个事务,这个事务中,如果有插入失败,则事务全部回滚。
      

  7.   

    另外,LZ在做这些事务的时候,set xact_abort的状态是什么呢。
      

  8.   

    测试四 中没有表bbb也是语法错误吧 怎么会插入记录呢?
    set xact_abort 是什么? 有什么作用呢?
      

  9.   


    CREATE TABLE [dbo].[t1](
    [id] [int] NOT NULL,
    [value] [int] NULL,
     CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED 
    (
    [id] ASC
    )) ON [PRIMARY]
    这样试试
      

  10.   

    哦 我大概知道了 默认情况下 set xact_abort 是off的 只会回滚出错的语句.是这样的吧
      

  11.   

    测试一:
    BEGIN TRANSACTION 
     insert into t1(id,value)values(2,'1')
     insert into t1(id,value)values(2,'1')
    commit TRANSACTION 
    结果:
    select * from t1
    id value
    2   1
    问题:
    为什么还能插入一条记录呢?
    原因: set xact_abort 是off的 只会回滚出错的语句,第二句出错了,所以只回滚第二句测试二:
    BEGIN TRANSACTION 
    insert into t1(id,value)values(2,'1')
    insert into t1(id,value1)values(2,'1')  --表中没有value1字段
    commit TRANSACTION 
    结果:
    select * from t1
    id value
    问题:
    为什么没有插入记录?
    原因: set xact_abort 是off的 严重的错误 ,回滚整个事务测试三:
    BEGIN TRANSACTION 
    insert into t1(id,value)values(2,'1')
    select id,value1 from t1   --表中没有value1字段
    commit TRANSACTION 
    结果:
    select * from t1
    id value
    问题:
    为什么没有出入记录?
    原因: set xact_abort 是off的 严重的错误 ,回滚整个事务测试四:
    BEGIN TRANSACTION 
    insert into t1(id,value)values(2,'1')
    select * from  bb   --bb表不存在
    commit TRANSACTION 结果:
    select * from t1
    id value
    2   1
    问题:
    为什么会茶入记录?
    原因: 不知道为什么了?
      

  12.   

    哦 我大概知道了 默认情况下 set xact_abort 是off的 只会回滚出错的语句.是这样的吧
    可以了吧!