请问各位都是怎么解决并发问题呢(sql server)
例如:在火车售票系统中,当某次车只剩最后一张票的时候,有多个客户分别在不同的售票窗口购票,这时一张票不可能卖给两个人,用什么方法来保证这种并发操作呢,加锁吗?或者该怎么处理呢 问题点数:100、回复次数:13Top
1 楼mywhsw(bamboo)回复于 2003-12-02 13:09:37 得分 10
用一个标识,在选择那张票的时候先用
(Update 表 set 票flag=‘占用了!’ where 票flag=‘未占用’ and ........)
这样是保险的,不可能存在并发问题,这就牵扯到sql锁机制问题了,你可以测试一下,其实sql中update是先查询出然后删除再添加,但由于使用了update,过程中就自动加锁了,很方便吧Top
2 楼welyngj(无爱)回复于 2003-12-02 13:09:41 得分 10
加锁。
Microsoft® SQL Server™ 2000 使用锁定确保事务完整性和数据库一致性。锁定可以防止用户读取正在由其他用户更改的数据,并可以防止多个用户同时更改相同数据。如果不使用锁定,则数据库中的数据可能在逻辑上不正确,并且对数据的查询可能会产生意想不到的结果。
虽然 SQL Server 自动强制锁定,但可以通过了解锁定并在应用程序中自定义锁定来设计更有效的应用程序。
Top
3 楼Leftie(左手,为人民币服务)回复于 2003-12-02 13:16:24 得分 10
用事务处理来控制Top
4 楼yoki(小马哥--鬓微霜,又何妨)回复于 2003-12-02 13:25:17 得分 5
用事务处理解决并发问题Top
5 楼leimin(黄山光明顶)回复于 2003-12-02 13:40:28 得分 5
通过事务来解决(其实就是LOCK)Top
6 楼datacen(datacen)回复于 2003-12-02 13:57:35 得分 10
用timestamp,解决lock的最常用方法Top
7 楼lvltt(未完成)回复于 2003-12-02 15:57:13 得分 10
--设tb(A,B,C)
create table #tb(A varchar(2),B varchar(2),C varchar(2))
insert into #tb
select 'a1','b1','c1'
union all select 'a2','b2','c2'
union all select 'a3','b3','c3'
/********** 加锁 ***************
设table1(A,B,C)
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
1)排它锁
新建两个连接
在第一个连接中执行以下语句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
select * from table1
where B='b2'
commit tran
若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒
2)共享锁
在第一个连接中执行以下语句
begin tran
select * from table1 holdlock -holdlock人为加锁
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
select A,C from table1
where B='b2'
update table1
set A='aa'
where B='b2'
commit tran
若同时执行上述两个语句,则第二个连接中的select查询可以执行
而update必须等待第一个连接中的共享锁结束后才能执行 即要等待30秒
3)死锁
增设table2(D,E)
D E
d1 e1
d2 e2
在第一个连接中执行以下语句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30'
update table2
set D='d5'
where E='e1'
commit tran
在第二个连接中执行以下语句
begin tran
update table2
set D='d5'
where E='e1'
waitfor delay '00:00:10'
update table1
set A='aa'
where B='b2'
commit tran
同时执行,系统会检测出死锁,并中止进程
Top
8 楼txlicenhe(马可)回复于 2003-12-02 18:27:18 得分 10
1 如何锁一个表的某一行
A 连接中执行
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
select * from tablename with (rowlock) where id=3
waitfor delay '00:00:05'
commit tran
B连接中如果执行
update tablename set colname='10' where id=3 --则要等待5秒
update tablename set colname='10' where id<>3 --可立即执行
2 锁定数据库的一个表
SELECT * FROM table WITH (HOLDLOCK)
注意: 锁定数据库的一个表的区别
SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除
SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除
SELECT 语句中“加锁选项”的功能说明
SQL Server提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能。用户既能使用SQL Server的缺省设置也可以在select 语句中使用“加锁选项”来实现预期的效果。 本文介绍了SELECT语句中的各项“加锁选项”以及相应的功能说明。
功能说明:
NOLOCK(不加锁)
此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”。
HOLDLOCK(保持锁)
此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。
UPDLOCK(修改锁)
此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。
TABLOCK(表锁)
此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。 这个选项保证其他进程只能读取而不能修改数据。
PAGLOCK(页锁)
此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。
TABLOCKX(排它表锁)
此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。
Top
9 楼leecooper0918(爱一个人好难)回复于 2003-12-02 20:49:59 得分 0
To 楼上: 写的不错,收藏.
Top
10 楼pengdali()回复于 2003-12-02 20:51:46 得分 10
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
是为了防止在事务没有完成的时候另一用户,访问事务内,未提交的数据
create table Table1 (a int)
go
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin tran
insert table1 values(1) ----这句在事物没有commit前,被另一个用户
----访问是错误的,应为下面有可能会出错
insert table1 values('aaa') ----这句由于类型不一样将报错
----设置了SERIALIZABLE的话就不会发生脏读
commit tran
select * from table1Top
11 楼hgm13579(天山孤人)回复于 2003-12-02 21:26:54 得分 0
要不要这么麻烦?有没有简单些的方法???Top
12 楼CrazyFor(冬眠的鼹鼠)回复于 2003-12-02 22:18:58 得分 10
在打印票之前再次检查票是不是还没有卖掉,而不是在查询时就做这样的确认就行了.Top
13 楼qinqindodo(无奈朝来寒雨晚来风)回复于 2003-12-02 22:22:43 得分 10
其实在实际编程中,我使用存储过程来提交数据,提交前检验是否符合条件(与界面提供的数据是否相同,如果不是,就回滚)。也许比较土,不过在实际应用中还没有出现过问题。Top
相关问题
- sql server并发操作问题,急!
- Sql Server 2000 并发访问的问题
- 高分求助 有关并发的问题,Tomcat5+SQL Server.
- SQL Server的并发用户数或者license怎么理解?
- 各版本的sql server数据库都能支持多少个并发连接?
- SQL Server中,并发查询和查完一个再查一个,哪个平均效率高?
- ASP+SQL SERVER,在处理多用户并发处理时应注意的问题有哪些?
- ★★第一个解决的,200分全给他:怎样用Delphi程序创建sql server的合并发布?★★
- 请问在VB+SQL SERVER做管理系统时,多个用户操作时怎样处理并发操作?
- 請問各位SQL Server中跨server訪問的怪咚咚??




