在数据库的同一个事务中,是否允许两条Update 语句更新同一个记录

孙新建 发布于 2015/08/27 11:57
阅读 14K+
收藏 2

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

set tran isolation level serializable
begin tran
	begin try
		print @@trancount
		update kct04 set kczksl=kczksl+4  where u_id=27
		update kct04 set kczksl=kczksl+5 where u_id=27
	end try
	begin catch
		print '事务出错'
		if(@@trancount>0)
			rollback tran
	end catch
if(@@TRANCOUNT>0)
	begin
		print '事务成功'
		commit tran
	end
这条语句输出结果是什么?数据库引擎是SQL Server  2008
加载中
1
mark35
mark35
必须是+9啊
1862194365
1862194365
回复 @孙新建 : 同一个事务中的修改对后续是可见的。其他事务是否可见要看数据库隔离级别
mark35
mark35
回复 @孙新建 : 写了这么多,不如自己实际执行下SQL就知道结果如何了
mark35
mark35
回复 @孙新建 : 同一个事务中前面的锁不影响后面的操作。锁是以事务为边界的。
孙新建
孙新建
第一个Update不是已经锁住了行,第二个Update是不是应该报错呢?
1
彪付_3个字符
同一个事务,同一行记录,第二条在第一条基础上执行
1
huan
huan

引用来自“逆流de鱼”的评论

数据库隔离性等级为:serializable 说明不允许脏读、不允许重复读、不允许幻读,及第一条更新语句已经对数据进行了更改但未提交,第二条语句是不能对数据进行任何操作的。
这么多答案,就是这个靠点边了,但还是错了。 隔离级别只是隔离不同事务间的数据可见性和操作性,在同一个事务中是可以做连续修改操作的。
huan
huan
回复 @逆流de鱼 : 之所以要有事务和隔离的概念,是因为会有并发执行的情况发生,但在同一个事务中,所有操作都是顺序执行的。做隔离毫无意义。
逆流de鱼
逆流de鱼
受教了,也就是说同一个事务中或同一session会话中隔离性是发挥不了任何作用的?
0
fat-rabbit
fat-rabbit
感觉裸提交应该是+9,使用ORM框架缓存的话,应该是+5。
fat-rabbit
fat-rabbit
回复 @孙新建 : 你这个事存储过程,如果想尝试ORM,可以直接写两条SQL,而不要在ORM调用存储过程。
孙新建
孙新建
都是正常的9
0
自由PHP
自由PHP
数据库带锁,不会出现语句被忽略不执行的情况,就怕同时请求太多,你服务器不够强大,被阻塞,,您多虑了
0
galaxist1314
galaxist1314
这样直接根据主键更新数据的做法是错误的。应该AND被更新的记录,如果执行结果是0条更新就要异常处理。
0
逆流de鱼
逆流de鱼
数据库隔离性等级为:serializable 说明不允许脏读、不允许重复读、不允许幻读,及第一条更新语句已经对数据进行了更改但未提交,第二条语句是不能对数据进行任何操作的。
0
jeffsui
jeffsui
行级锁
0
乌龟壳
乌龟壳
无论是什么样的事务隔离级别,主要区别在读,你这都是写的事务,从第五行开始就是在行上加锁了。前一个事务在第五行代码针对uid是27的行加锁,后一个执行到第五行时会等待第一个提交。
0
flygogo
flygogo
@all  都神人...
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部