社区
应用实例
帖子详情
怎样同时只让一个客户端排他地执行一段代码?
hdyd
2004-12-20 07:45:31
1 : select @qty = qty from tablea
2 : update tablea set qty = qty + 1
存储过程里面有两条语句。
如果机器A 机器B同时执行这个存储过程,
我想让机器A把两条语句都执行完,机器B才可以进入?
怎样做啊?
...全文
164
13
打赏
收藏
怎样同时只让一个客户端排他地执行一段代码?
1 : select @qty = qty from tablea 2 : update tablea set qty = qty + 1 存储过程里面有两条语句。 如果机器A 机器B同时执行这个存储过程, 我想让机器A把两条语句都执行完,机器B才可以进入? 怎样做啊?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cqdj
2004-12-23
打赏
举报
回复
up,学习。使用分布式事务吧!不然就需要在设计的时候考虑这个问题,也就是在需要在数据表中设置相应的字段。
NinGoo
2004-12-22
打赏
举报
回复
SERIALIZABLE
在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
然后再使用事务,这样应该就可以了,不过事务执行时间不能太长执行
NinGoo
2004-12-22
打赏
举报
回复
SET TRANSACTION ISOLATION LEVEL
控制由连接发出的所有 Microsoft® SQL Server™ SELECT 语句的默认事务锁定行为。
语法
SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE
}
参数
READ COMMITTED
指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。
READ UNCOMMITTED
执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。
REPEATABLE READ
锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。
SERIALIZABLE
在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
注释
一次只能设置这些选项中的一个,而且设置的选项将一直对那个连接保持有效,直到显式更改该选项为止。这是默认行为,除非在语句的 FROM 子句中在表级上指定优化选项。
SET TRANSACTION ISOLATION LEVEL 的设置是在执行或运行时设置,而不是在分析时设置。
示例
下例为会话设置 TRANSACTION ISOLATION LEVEL。对于每个后续 Transact-SQL 语句,SQL Server 将所有共享锁一直控制到事务结束为止。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
BEGIN TRANSACTION
SELECT * FROM publishers
SELECT * FROM authors
...
COMMIT TRANSACTION
hdyd
2004-12-22
打赏
举报
回复
select @qty = qty from tablea WITH (TABLOCKX)
也试过了,还是不行。
631799(杭州工人) :
不行得原因是因为,我打算用下面两行代码产生唯一的流水号@qty
select @qty = qty from tablea
update tablea set qty = qty + 1
现在6台电脑同时跑,出现重复的流水号@qty了
clavier
2004-12-21
打赏
举报
回复
提高事务隔离级别
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
然后再开启事务
631799
2004-12-21
打赏
举报
回复
我上面说的不对!
631799
2004-12-21
打赏
举报
回复
原来你是分布式事务啊。
先启动MSDTC服务。
BEGIN DISTRIBUTED TRANSACTION
select @qty = qty from tablea
update tablea set qty = qty + 1
if @@error=0
commit tran
else
rollback tran
631799
2004-12-21
打赏
举报
回复
怎么个不行法呢?
nice90
2004-12-21
打赏
举报
回复
with lock
hdyd
2004-12-20
打赏
举报
回复
631799(杭州工人) :
不行的,我试过。
vinsonshen
2004-12-20
打赏
举报
回复
对,像楼上说的,用事务,当begin tran执行时,SQL 语句而获取的许多资源被该事务锁定,直到此事务以 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句完成
begin tran
select @qty = qty from tablea
update tablea set qty = qty + 1
if @@error=0
commit tran
else
rollback tran
goregrypeck
2004-12-20
打赏
举报
回复
用锁
如:select * from table with (lockx) 具体的相关锁查看帮助
631799
2004-12-20
打赏
举报
回复
用事务:
begin transaction
select @qty = qty from tablea
update tablea set qty = qty + 1
commit transcation
RabbitMQ:
排
他性队列(Exclusive Queue)
本文介绍RabbitMQ中
排
他性队列的概念及其特点:仅对首次声明的连接可见,并在连接断开时自动删除。不论队列是否被声明为持久性。示例
代码
展示了同一连接的不同通道访问
排
他性队列的过程。
org.hibernate.sqlquery 同时
执行
多条update_一条简单的 SQL
执行
超过 1000ms,纳尼?
本文介绍了一次
排
查MySQL性能问题的过程,特别是在Docker环境下跨进程调用导致的SQL
执行
超时现象。通过监控工具定位问题源头并解决死锁,优化了数据库性能。
rabbitmq-exclusive queue
本文深入探讨了RabbitMQ中
排
他性队列的概念,包括其特点和工作原理。通过示例
代码
展示了如何在同一连接的不同通道中访问
排
他性队列,并解释了连接与通道的区别。
操作系统-数据库-(通用锁思想)MySQL-锁机制——乐观锁、悲观锁;共享锁、
排
他锁、行表锁、间隔后码锁、MVCC 与 thinkphp的lock解析
本文深入解析MySQL的锁机制,涵盖乐观锁、悲观锁、共享锁、
排
他锁、行锁、表锁、间隙锁、临键锁及MVCC原理。重点分析InnoDB的加锁规则、死锁检测与避免策略,并探讨索引对锁粒度的影响,帮助开发者提升并发处理能力与系统稳定性。
Zookeeper分布式锁原理浅析和
代码
示例
本文探讨了如何利用Zookeeper的节点变更监听机制实现高效的分布式
排
他锁,通过Curator框架展示如何在Java应用中实现实例。重点在于理解锁的定义、获取与释放过程,并通过
代码
实例说明其在避免ID冲突中的作用。
应用实例
27,579
社区成员
68,548
社区内容
发帖
与我相关
我的任务
应用实例
MS-SQL Server 应用实例
复制链接
扫一扫
分享
社区描述
MS-SQL Server 应用实例
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章