SQL语句问题 根据SELECT 的结果来UPDATE,同时要得到SELECT的结果

fz_zhou 2008-03-05 07:38:22
1. 我有一个数据库,表里面存的是一个资源,资源是否使用有一列是否为空来表示。然后谁要申请资源,我会先得到第一个不为空的列,再把这一列数据标记为非空。同时要返回刚修改数据中的一项值。

1.如果写成一条SQL:
"update my_table set col1=?, time=NOW where id in (select TOP 1 id from my_table " +
" where col2 is NULL ORDER BY id )";
这样的话,达到我的功能,但我取不出刚刚被update 这一项的ID;

2.如果写成二条语句:
A得到结果. select TOP 1 id from my_table where col2 is NULL ORDER BY id
B: update my_table set col1=?, time=NOW where id = select_id;

先执行A再执行B,我的程序是多线程的,这样会不会在我没有update的时候又有另一个线程又来执行A,这样还是我手工加锁同步,数据库有没有机制来保证这种事情?我用的是 HSQLDB
...全文
510 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cz_2008 2008-03-05
  • 打赏
  • 举报
回复
java同步机制??
chaorenwopashei 2008-03-05
  • 打赏
  • 举报
回复
有点不太明白了是什么意思嘛,
cnwolfwind 2008-03-05
  • 打赏
  • 举报
回复
学习
goodmrning 2008-03-05
  • 打赏
  • 举报
回复
学习
cb1156 2008-03-05
  • 打赏
  • 举报
回复
可以用过程。
hcmsxy 2008-03-05
  • 打赏
  • 举报
回复
select TOP 1 id from my_table where col2 is NULL for update
barech 2008-03-05
  • 打赏
  • 举报
回复
lz没有表述清楚,请再组织一下语言:
1.我有一个数据库,表里面存的是一个资源,资源是否使用有一列是否为空来表示。然后谁要申请资源我会先得到第一个不为空的列,再把这一列数据标记为非空。同时要返回刚修改数据中的一项值。
标记颜色那个部分逻辑有些问题吧
yibunengjing 2008-03-05
  • 打赏
  • 举报
回复
楼主你这样的需求,而且是多线程,那就只能采用自己手动加锁来控制了,这样也是安全的一种做法。
benro 2008-03-05
  • 打赏
  • 举报
回复
jf
moodoasis 2008-03-05
  • 打赏
  • 举报
回复
“我会先得到第一个不为空的列,再把这一列数据标记为非空“这句话,说的是不同列吗?

select TOP 1 id from my_table where col2 is NULL 你实在找,一个空列吗?
dracularking 2008-03-05
  • 打赏
  • 举报
回复
没有同步就会啊 数据库本来就是支持并发访问的 我想这种相对的功能可能应该是有的
锁表?
Amerson 2008-03-05
  • 打赏
  • 举报
回复
我觉得用SQL语句不能实现同时取到值又做update。
楼上说的用存过是个好主意,或者用Function , 返回取到的值, 并且做update。
cb1156 2008-03-05
  • 打赏
  • 举报
回复
你把帖子转去 SQL 区吧
我绝对用过程是最好的解决办法
我不是大明 2008-03-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 moodoasis 的回复:]
“我会先得到第一个不为空的列,再把这一列数据标记为非空“这句话,说的是不同列吗?
表达错了,SORRY,找一列数据为空的第一个值,再将这个值设置为非空,同时要返回被更新这行的另一个值.

select TOP 1 id from my_table where col2 is NULL 你实在找,一个空列吗?
[/Quote]
我不是大明 2008-03-05
  • 打赏
  • 举报
回复
谢谢大家的回复,可能我没表达清楚,比如我现在表A:
A
ID Resouces Flag
1 No1 USED
2 No2 NULL
3 No3 NULL

然后我要先用一个查询查到,第一个回空也就是说是id=2这一列,然后要标记这一列的FLAG为 USED,然后将No2返回给请求者.

就是要做这样一件事情,有没有SQL语句能做到?

FOR UPDATE能解决我的问题吗?一样会在

SELECT和UPDATE之间有另一个线程来再次调用SELECT,或者说再SELECT就不返回? 而且这个FOR UPDATE好象HSQLDB里面也没有.

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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