在同一事务条件下,回滚和不提交,表现是一样的
但是还有些差别
事务处理,是将 *** 作事件交给数据库(模拟)运行,直到commit *** 作,才使得修改实际产生效果,你可以看做是未提交事务都是处于一个临时库中进行
回滚是对于同一个事务,如果产生了错误,那么取消这个临时库中的 *** 作,不对实际数据产生影响
最主要的区别在于,如果不回滚,这些临时 *** 作会持续到这个个connection结束为止,也就是虽然你看不到,但是临时库的 *** 作依然存在,而回滚是即时生效,其实都是回滚了,只是时间点的不一样
2.
我说你在开玩笑吧。没有提交事务并不代表你对数据库的改变不存在,如果是脏读的隔离层级你修改数据到提交完成前的变更其他访问者也是可以看到的。只有你提交后这部分修改才确认不会变更而已,哪怕设定了其他隔离级别也可以看到了。
如果你不回滚,那么线程就停在哪里搁着?制造出数据库死链放着不管直到数据库认为这个连接超时自动断开并自动回滚?
ISOLATION_READ_UNCOMMITTED:允许读取其他并发事务还未提交的更新,会导致事务之间的3个缺陷发生,这是速度最快的一个隔离级别,但同 时它的隔离级别也是最低
--创建存储过程
alter proc proc_aa_aa1
(@id int,@name varchar(255) ,@sex char(2))
as
--创建事务
begin Transaction tran_charge
--定义变量记录错误数
declare @reeSum int
set @reeSum=0
--尝试执行sql语句
begin try
insert into aa(id,name,sex) VALUES ('1','as','男')
set @reeSum=@reeSum+@@ERROR
--@@error当前一个语句遇到错误,则返回错误号,否则返回0。需要注意的是@ERROR在每一条语句执行后会被立刻重置
insert into aa1(id,name,sex) VALUES ('1','as','男女')
print @@ERROR
set @reeSum=@reeSum+@@ERROR
end try
begin catch
--打印错误信息
print '错误编号:'+convert(varchar,error_number())+'错误消息'+error_message()
print @reeSum
set @reeSum=@reeSum+@@ERROR
end catch
print '111'
print @reeSum
if(@reeSum>0)--有错误
rollback Transaction tran_charge --回滚事务
else
commit Transaction tran_charge--提交事务
--通过调用存储过程,给相应的参数,
exec proc_aa_aa1'2','1','3'
@@ROWCOUNT //返回
@@ERROR //返回错误码
insert into aa(id,name,sex) VALUES ('1','as','男')
insert into aa1(id,name,sex) VALUES ('1','as','男女')
delete from aa
delete from aa1
select * from aa
select * from aa1
一组业务整体处理的行为叫一个事务。这一组的业务都能成功处理,我们就可以把这个事务提交来保存你已做的行为结果。但如果一组中有任何的差错出现的话,我们就认为这事务不成功,需要回滚来撤消之前的 *** 作。举例:你去银行转账,转账我们有两步吧,从你账户中取出钱再往他账户中加钱。那这两步银行是必须要确保正确无误的进行的。要被看做成一个事务。其中任何一步出错就算是转账失败,但可能你这时是已经从你账户中扣了钱了,又没往他账户里加钱?怎么办算了?你不肯吧。所以银行会事务回滚,不保存你刚才的 *** 作,即恢复到你没转账之前的状态。累啊欢迎分享,转载请注明来源:内存溢出
评论列表(0条)