SQL Server中的事务与锁

发表于:2014-6-10 10:16

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:张龙豪    来源:51Testing软件测试网采编

---开启事务
begin tran
--错误扑捉机制,看好啦,这里也有的。并且可以嵌套。
begin try
--语句正确
insert into lives (Eat,Play,Numb) values ('猪肉','足球',1)
--加入保存点
save tran pigOneIn
--Numb为int类型,出错
insert into lives (Eat,Play,Numb) values ('猪肉','足球',2)
--语句正确
insert into lives (Eat,Play,Numb) values ('狗肉','篮球',3)
end try
begin catch
select Error_number() as ErrorNumber,  --错误代码
Error_severity() as ErrorSeverity,  --错误严重级别,级别小于10 try catch 捕获不到
Error_state() as ErrorState ,  --错误状态码
Error_Procedure() as ErrorProcedure , --出现错误的存储过程或触发器的名称。
Error_line() as ErrorLine,  --发生错误的行号
Error_message() as ErrorMessage  --错误的具体信息
if(@@trancount>0) --全局变量@@trancount,事务开启此值+1,他用来判断是有开启事务
rollback tran   ---由于出错,这里回滚事务到原点,第一条语句也没有插入成功。
end catch
if(@@trancount>0)
rollback tran pigOneIn --如果成功Lives表中,将会有3条数据。
--表本身为空表,ID ,Numb为int 类型,其它为nvarchar类型
select * from lives
  使用set xact_abort
  设置 xact_abort on/off , 指定是否回滚当前事务,为on时如果当前sql出错,回滚整个事务,为off时如果sql出错回滚当前sql语句,其它语句照常运行读写数据库。
  需要注意的时:xact_abort只对运行时出现的错误有用,如果sql语句存在编译时错误,那么他就失灵啦。
delete lives  --清空数据
set xact_abort off
begin tran
--语句正确
insert into lives (Eat,Play,Numb) values ('猪肉','足球',1)
--Numb为int类型,出错,如果1234..那个大数据换成'132dsaf' xact_abort将失效
insert into lives (Eat,Play,Numb) values ('猪肉','足球',12345646879783213)
--语句正确
insert into lives (Eat,Play,Numb) values ('狗肉','篮球',3)
commit tran
select * from lives
为on时,结果集为空,因为运行是数据过大溢出出错,回滚整个事务。
事务把死锁给整出来啦
跟着做:打开两个查询窗口,把下面的语句,分别放入2个查询窗口,在5秒内运行2个事务模块。
begin tran
update lives set play='羽毛球'
waitfor delay '0:0:5'
update dbo.Earth set Animal='老虎'
commit tran
begin tran
update Earth set Animal='老虎'
waitfor  delay '0:0:5' --等待5秒执行下面的语句
update lives set play='羽毛球'
commit tran
select * from lives
select * from Earth
  为什么呢,下面我们看看锁,什么是锁。
  并发事务成败皆归于锁——锁定
  在多用户都用事务同时访问同一个数据资源的情况下,就会造成以下几种数据错误。
  更新丢失:多个用户同时对一个数据资源进行更新,必定会产生被覆盖的数据,造成数据读写异常。
  不可重复读:如果一个用户在一个事务中多次读取一条数据,而另外一个用户则同时更新啦这条数据,造成第一个用户多次读取数据不一致。
  脏读:第一个事务读取第二个事务正在更新的数据表,如果第二个事务还没有更新完成,那么第一个事务读取的数据将是一半为更新过的,一半还没更新过的数据,这样的数据毫无意义。
  幻读:第一个事务读取一个结果集后,第二个事务,对这个结果集经行增删操作,然而第一个事务中再次对这个结果集进行查询时,数据发现丢失或新增。
  然而锁定,就是为解决这些问题所生的,他的存在使得一个事务对他自己的数据块进行操作的时候,而另外一个事务则不能插足这些数据块。这就是所谓的锁定。
42/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号