34,838
社区成员




楼主可以这样来看下这两者的区别:
create proc p1 --没有使用事务
as
insert into table1 (id) values (1)
insert into table1 (id) values ('abc')
insert into table1 (id) values (3)
--
create proc p2 --使用了事务
as
begin tran
insert into table1 (id) values (1)
insert into table1 (id) values ('abc')
insert into table1 (id) values (3)
commit tran
两者的区别是第一个存储过程的第一个insert语句是可以被执行的,也就是说能够向数据库插入一条数据,而第二个是不能插入的。
所以第一个存储过程并不是楼主所理解的原子操作。而是因为当执行insert into table1 (id) values ('abc')的时候出错,那么整个存储过程就跳出了,终止了存储过程的执行。但是第一条已经执行了,是不撤销的。
原子操作是里面的操作要么全部执行,要么一个都不执行,所以存储过程如果不声明为事务的话,不是一个原子操作。