关于数据库事务的基本概念,我还弄不明白。

rocknet 2004-06-14 09:58:36
有这样一个例子,给一个班级添加学员,班级只能有50个人,现在要往里面添加n个学员,查询和添加要在同一个事务里完成。
在单机环境下,可以这么写:
select count(*) from aClass
if count+n<50 then
insert students to aClass
else
throw Exception
end if
但是在多用户环境下,是不是就得用到事务了,是不是照搬下来就可以了呢?
Transaction.begin
select count(*) from aClass
if count+n<50 then
insert students to aClass
else
Transaction.rollback
end if
Transaction.commit
这么简单吗?begin、commit、rollback的位置对不对呢?
...全文
180 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2004-06-16
  • 打赏
  • 举报
回复
至于那种情况,一般的处理方法是:
方法1,选出记录时就锁定表,这样就可以防止其他人添加数据
方法2,在保存时再做一次检测
zjcxc 2004-06-16
  • 打赏
  • 举报
回复
既然想用java,就到java版去问.
rocknet 2004-06-16
  • 打赏
  • 举报
回复
当然也要谢谢pjy(古虫) ,呵呵。。。差点忘了。
rocknet 2004-06-16
  • 打赏
  • 举报
回复
呵呵,谢谢五星上将的回答,使我倍感荣幸啊。
我想用java实现,不确定用什么数据库。
也许是我表达的不准确,这个问题是分两步的
1、先选出可加人数
2、添加一定数量的学员。
这两步的执行是分开的,也许要间隔几分钟,我怕到执行第二步的时候,可添加人数已经发生了变化(已经满了,或可加人数少于第二步输入的人数),这样,第二步就做不下去了。
我想知道这样的问题一般是怎么解决的呢?站在用户这个角度,怎样做能让客户接受呢?
rocknet 2004-06-16
  • 打赏
  • 举报
回复
谢谢。
pjy 2004-06-15
  • 打赏
  • 举报
回复
同意楼上的写法!
楼主必须在select count(*) from aClass
语句上人为申请锁,该语句不会自动维护锁,所以即使在事务中也不能保证业务逻辑执行正确!

不过,楼上的,我觉得不一定要用表锁,人为申请一个更新锁,也可以达到目的,只要所有执行该业务的都是通过这个程序来访问!
zjcxc 2004-06-14
  • 打赏
  • 举报
回复
--标准的SQL Server处理方法(不知道楼主原来写的那个是什么数据库的??)

declare @count int
begin tran
select @count=count(*) from aClass(tablockx) --加上表级锁,只允许一个用户处理
while @count<50
begin
insert students values(....)
set @count=@count+1
end
commit tran
littlefat 2004-06-14
  • 打赏
  • 举报
回复
建议还是将事务放到存储过程中来完成。。。
rocknet 2004-06-14
  • 打赏
  • 举报
回复
up一下可以吗?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧