社区
应用实例
帖子详情
怎样同时只让一个客户端排他地执行一段代码?
hdyd
2004-12-20 07:45:31
1 : select @qty = qty from tablea
2 : update tablea set qty = qty + 1
存储过程里面有两条语句。
如果机器A 机器B同时执行这个存储过程,
我想让机器A把两条语句都执行完,机器B才可以进入?
怎样做啊?
...全文
111
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
Redis Lua脚本好处、Redis
执行
Lua的两种方式、Redis缓存Lua脚本、Redis Lua原子性验证、Lua脚本IP限流、Lua脚本自乘
以
客户端
执行
乘法脚本为例,在redis
客户端
执行
Lua语言,拼接了很多命令,如果这样的一长
执行
串命令发给服务端,那么网络通信就会产生比较大的开销,所以Redis支持在服务端直接缓存一部分脚本的内容(它是用脚本生成了
一段
摘要,服务端可以根据这个摘要去
执行
脚本内容)。Lua脚本实现原子性的原理,就是
执行
一个
Lua脚本的时候,里面有多个命令,这个时候会阻塞其它任何命令的
执行
和其它任何
客户端
的请求,也就是说,
执行
Lua的时候,只会
执行
Lua里的命令,以此来达到Lua里的多条命令成为
一个
整体来
执行
。
xxjob
代码
执行
过程
调度中心:负责管理调度信息,按照调度配置发出调度请求,自身不承担业务
代码
。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及
执行
日志,支持
执行
器Failover,支持创建
执行
器等功能。
执行
模块(
执行
器):负责接收调度请求并
执行
任务逻辑。任务模块专注于任务的
执行
等操作,开发和维护更加简单和高效;
无法用
排
他锁锁定该数据库,以
执行
该操作!
无法用
排
他锁锁定该数据库,以
执行
该操作!
那么参考下究竟什么是锁吧:
锁是网络数据库中的
一个
非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别。目前,大多数数据库管理系统都或多或少具有自我调节、自我管理的功能,因此很多用户实际上不清楚锁的理论和所用数据库中锁的具体实现。
Microsoft SQL Server(以下简称SQL Ser
Redis基本事务操作
Redis 事务 Redis 事务可以一次
执行
多个命令, 并且带有以下三个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存。 收到 EXEC 命令后进入事务
执行
,事务中任意命令
执行
失败,其余的命令依然被
执行
。 在事务
执行
过程,其他
客户端
提交的命令请求不会插入到事务
执行
命令序列中。
一个
事务从开始到
执行
会经历以下三个阶段: 开始事务。 命令入队。
执行
事务。 Redis 事务本质:一组命令的集合!
一个
事务中的所有命令都会被序列化,在事务
执行
过程的中,会按照顺序
执行
! 一次性、顺序性、
排
他性!
无法用
排
他锁锁定该数据库,以
执行
该操作。
在
执行
数据库重名时[code="sql"] EXEC sp_renamedb 'tongshan_conv', 'fuNan_conv' [/code] 出现了 无法用
排
他锁锁定该数据库,以
执行
该操作! 那么参考下究竟什么是锁吧: 锁是网络数据库中的
一个
非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。各种大型数据库所采用的锁的基本理论...
应用实例
27,579
社区成员
68,558
社区内容
发帖
与我相关
我的任务
应用实例
MS-SQL Server 应用实例
复制链接
扫一扫
分享
社区描述
MS-SQL Server 应用实例
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章