关于SQL存储过程的疑问

sun5157 2012-09-27 08:26:49

while (bool) {
if (st <= wbl.getNuberPrint()) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

st++;
long BagSerialNumber = manage.getBagNum(new Date());//从数据库表1中取出当天计数字段的值
lableEntity.setSerialNumber(BagSerialNumber+1);//计数的值加1后存入对象
bool = InsertBagUpdate(lableEntity);//调用存储过程写入数据库表1,存储过程返回值与预期一致的话返true
}
if (st == wbl.getNuberPrint()) {

break;
}
}


上面是我的代码的一部分,现在的问题是实际使用中,一个月总有几次出现当天插入的值出现重复,我想请教下存储过程实际执行中会不会有延迟,导致我紧接着查询时出现没有查询到最新值的问题?还有最好怎么写才能避免此类问题,是用sql语句直接写更好吗? 次存储过程中只有插入表值的操作
谢谢
...全文
123 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
南冰 2012-09-27
  • 打赏
  • 举报
回复
LS +1
gogodiy 2012-09-27
  • 打赏
  • 举报
回复

SET XACT_ABORT ON

BEGIN TRANSACTION

--计算相应数据

--插入数据

COMMIT TRANSACTION
sun5157 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

并发情况下,这个控制是不足的,总有时间差,唯一的方法是锁

在存储过程实现
开事务
取出当天计数字段的值(并加锁)
插入数据
提交事务

这样才能控制
[/Quote]
谢谢
昵称被占用了 2012-09-27
  • 打赏
  • 举报
回复
并发情况下,这个控制是不足的,总有时间差,唯一的方法是锁

在存储过程实现
开事务
取出当天计数字段的值(并加锁)
插入数据
提交事务

这样才能控制
sun5157 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

不要先獲取,然後在程序中更新,直接調用一次程序,在數據庫中更新時獲取序列號並更新
[/Quote]
首先谢谢,但是关键在于我取出这个值后还要做很多操作,生成一些数据,再存入对象一起写回数据库,不是简单的增加一个计数
人生无悔 2012-09-27
  • 打赏
  • 举报
回复
不要先獲取,然後在程序中更新,直接調用一次程序,在數據庫中更新時獲取序列號並更新

22,209

社区成员

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

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