|zyciis| 200:ASP.NET 面向对像方法和SQL数据库的冲突 大家看有什么好的解决方法 谢谢 PS:问题很长

zyciis208 2009-01-05 03:03:31
如我有会员表
Memeber
ID Name Bonus
1 Jerry 500

有会员申请对换表
ExchangeAudit
ID MemberID Bonus
----------------------------------
如为上面的数据库的话我就会建立如下逻辑类

public MemberInfo
{
Int32 _ID=0;
public Int32 ID
{
Get{..}
Set{..}
}
String _Name=0;
public String Name
{
Get{..}
Set{..}
}
Decimal _Bonus=0;
public Decimal Bonus
{
Get{..}
Set{..}
}
}
public ExchangeAuditInfo
{
...
//如上相同
}

----------------------------------
然后当用户申请一条对换记录时就会用

SqlOperater oo = new SqlOperater()//建立数据库连接
oo.BeginTransation() //启动事务
try
{
MemberInfo infoMember = Member.GetInfo(oo,1);//这里是取得ID=1的会员信息
ExchangeAuditInfo info = new ExchangeAuditInfo(); //实例一个申请对像
info.MemberID=infoMember.ID //会员申请ID
info.Bonus = 500;
if(infoMember.Bonus < Info.Bonus)
{
Throw New Excpation("会员积分不够");
}
infoMember.Bonus = infoMember.Bonus - info.Bonus; //会员的积分 = 会员积分 - 申请积分
ExchangeAudit.Insert(oo,info);//插入申请记录
Member.Update(oo,infoMember); //更新会员信息
oo.Commit();//提交事务
}
catch(Excpation ex)
{
oo.Rollback(); //回滚事务
}
finally
{
oo.Dispose()//清空资源
}

以上代码初看是没有问题的
但如果存在并发情况的话就会出错比如
现在在两个地方(A,B)同时执行上面的操作
如果A已经走过了判断if(infoMember.Bonus < Info.Bonus)
但事务还没有提交的时候
了又判断了
if(infoMember.Bonus < Info.Bonus)
这时B也会通过
然后A提交
再B提交
但最后用户的积分还是为0,但却提交了两条记录,为什么会这样呢
因为:
开始的时候会员是500积分
A提交时是执行Set Bonus = 500 - 500;
B提交也是Set Bonus = 500 - 500
所以最后还是为0
------------------------------------------
这里我就想有没有办法在
MemberInfo infoMember = Member.GetInfo(oo,1);//这里是取得ID=1的会员信息
(其实他的SQL为 Select * From Member Where ID = 1);
这里的时候对这条记录进行排他锁呢?
但我问了数据库专区里面的人
开始他们说用
Select * From Member WITH(ROWLOCK) Where ID = 1
但这样没用,他只有防止其他事务更新,但其他事务可以读取数据,所以这里不行
然后他们又说用
Select * From Member WITH(??不记得是什么了,反正是页锁) Where ID = 1
但这样又会把我的很多数据销列相当于WITH(XTabLOCK);

那现在问一下ASP.NET专区的

对于以上问题 应该如何解决并发性问题呢

谢谢
...全文
160 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhnzzy 2009-01-05
  • 打赏
  • 举报
回复
参考:

SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE
}

参数
READ COMMITTED

指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。

READ UNCOMMITTED

执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。

REPEATABLE READ

锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。

SERIALIZABLE

在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。

zhnzzy 2009-01-05
  • 打赏
  • 举报
回复
并发你不会设计数据库锁级别吗?
  • 打赏
  • 举报
回复
其实,假设info根本不是从数据库中读取的,而是内存中的static对象,假设你没有lock,你仍然会遇到所谓“并发”问题。

所以,你的问题跟“asp.net面向对象方法和SQL数据库的冲突”还是有些不太贴切的。
  • 打赏
  • 举报
回复
其实我可以把你的问题稍扩展得更宽一些:

我们先做一个假设,假设在不同的线程中,对于不同的oo对象,语句表达式

Member.GetInfo(oo,1)

得到的对象完全是“同一个对象”。

此时,你的所谓“并发问题”已经被简化到及其简单化的程度,不是你强调的 GetInfo得到两个不同的对象,而是得到同一个对象,也就是说A中对它的info 变量的修改会立刻被B中的info变量所读取出来,那么此时就不存在你说的问题了吗?仍然存在。

我直接说结论:只要你写程序时不用lock,你永远存在与关系数据库的所谓“冲突”现象。
lovehongyun 2009-01-05
  • 打赏
  • 举报
回复
http://www.cnblogs.com/tintown/archive/2005/03/22/123404.html
看看这个.
lovehongyun 2009-01-05
  • 打赏
  • 举报
回复
这不是
"面向对像方法和SQL数据库的冲突"的问题,而就是一个并发问题

可以用一下时间戳防并发
vlysses 2009-01-05
  • 打赏
  • 举报
回复
oo.BeginTransation(IsolationLevel.*****,"");
asp.net的事务处理可以设置不同级别的锁,好好看看MSDN
zyciis208 2009-01-05
  • 打赏
  • 举报
回复
用事物不行么
--------------------
我上面说得很清楚了,存在并发的情况的话就会出错
谢谢
PI腊 2009-01-05
  • 打赏
  • 举报
回复
学习中……
jiang_jiajia10 2009-01-05
  • 打赏
  • 举报
回复
用事物不行么
jiezhi 2009-01-05
  • 打赏
  • 举报
回复
使用o/r mapping来处理是一个较为流行的做法。
SCARA机械臂的运动学建模与轨迹规划是工业机器人控制领域的关键技术。本研究项目以SCARA机械臂为对象,基于MATLAB机器人工具箱与CoppeliaSim仿真平台,构建了一套完整的运动学模型,并提出了多模式轨迹规划算法的实现方案。 在运动学建模方面,本研究重点解决正向运动学与逆向运动学两个核心问题。正向运动学根据给定的关节参数计算机械臂末端执行器的位姿;逆向运动学则针对期望的末端执行器位姿求解对应的关节参数。这两部分内容是机器人控制算法设计的理论前提。 轨迹规划作为机械臂路径规划的重要环节,决定了机械臂从起点运动至终点的过程。在此过程中,速度、加速度及加加速度等运动约束必须满足要求。本项目中的轨迹规划算法涵盖关节空间与笛卡尔空间两种模式:关节空间轨迹规划以关节角度、角速度和角加速度为规划对象;笛卡尔空间轨迹规划则聚焦于末端执行器的位移、速度及加速度。 在轨迹规划算法中,线性插值、抛物线插值及三次多项式插值是常用方法。线性插值适用于简单直线运动场景,实现方式直接高效;抛物线插值可在运动起始与结束阶段实现零速度与零加速度,适合平滑起停要求;三次多项式插值可生成更为平滑的轨迹,确保整个运动过程中速度与加速度连续,适用于对轨迹质量要求较高的情况。 本项目构建了可视化分析系统。利用CoppeliaSim平台将MATLAB计算所得的轨迹参数进行可视化展示,使用户能够直观观察SCARA机械臂的运动状态,实时监测各类运动参数变化,评估轨迹规划效果。系统开发需深入理解MATLAB编程、CoppeliaSim平台使用方法,并综合运用机械工程、机器人学及计算机仿真等多学科知识。本系统能够显著提升SCARA机械臂在实际应用中的智能化水平与运行灵活性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

62,269

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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