Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么是业务逻辑?_C#_Sql_Architecture_Transactions_Business Logic - Fatal编程技术网

C# 为什么是业务逻辑?

C# 为什么是业务逻辑?,c#,sql,architecture,transactions,business-logic,C#,Sql,Architecture,Transactions,Business Logic,让我们想象一下在网站上执行的任何常见操作 用户按下按钮后,应用程序应: 检查是否允许操作的条件用户权限、某些对象的一致性、关系等 更新数据库记录 汇报 这是业务逻辑层的关注点,因为它已经写在了大量的书籍中。 事实上,我们首先从数据库中读取数据,然后将数据写入数据库。如果在我们的检查过程中,任何其他用户/进程更改了数据,我们会将无效结果放入数据库。看起来这个问题应该是众所周知的,但我仍然找不到解决这个问题的好办法 问题是:为什么我们需要没有机会维护业务事务的业务逻辑层 你可能会说Transacti

让我们想象一下在网站上执行的任何常见操作

用户按下按钮后,应用程序应:

检查是否允许操作的条件用户权限、某些对象的一致性、关系等 更新数据库记录 汇报 这是业务逻辑层的关注点,因为它已经写在了大量的书籍中。 事实上,我们首先从数据库中读取数据,然后将数据写入数据库。如果在我们的检查过程中,任何其他用户/进程更改了数据,我们会将无效结果放入数据库。看起来这个问题应该是众所周知的,但我仍然找不到解决这个问题的好办法

问题是:为什么我们需要没有机会维护业务事务的业务逻辑层

你可能会说TransactionScope。那么,如何防止外部进程更改读取的数据?如何从业务层升级锁定?如果可能的话,那么这一切不都比在存储过程中进行事务要昂贵得多吗

没有办法把逻辑的一部分带到DB——只有全部。第1部分和第2部分必须在同一事务中实现,而且,读取数据必须锁定,直到进行了更新


想法?

我真的认为你的观点是错误的。首先,在您的特定示例中,似乎没有任何东西表明一个用户的投票更改会使另一个用户影响upvote的尝试无效。所以,如果我打开页面,有200票支持这个项目,我点击upvote,我真的不在乎是否有10个人同时也这么做了。因此,验证可以由业务层运行,如果结果是投票可以通过,则可以使用单个SQL语句以原子方式进行更新,例如更新投票集VoteCount=VoteCount+1,其中ID=@ID,或者使用UPDLOCK和update包装在事务中的select。ORMs和开发人员使用后一种方法的趋势既不存在也不存在,如果您愿意,您仍然可以选择更改实现

现在,如果要求更新投票计数实际上使我的投票无效,那么情况就完全不同了。在这种情况下,我们使用乐观或悲观并发是绝对正确的,但这显然不适用于一个网站,在这个网站上,数百人可以同时为同一个项目投票。这里的问题不是实现,而是允许多人处理同一个项目的本质


因此,总结一下,没有什么能阻止您在DB之外拥有一个业务层并保持增量原子化。同时,您希望享受将业务逻辑置于DB之外的好处,DB本身就是一个post,但我认为这是一个很大的好处。

通常,如果其他人同时更改数据的可能性很小,您会使用乐观锁定。另一方面,您的UPDLOCK是悲观锁定。关于这个话题有很多文档,机会很大。用户为某个主题投票的Imagine web应用程序。每次按下投票按钮后,我需要投票=投票+1。我读了当前的票数100,检查了一些东西,写了101个值,这已经是错误的,因为在这段时间里有500人投票。这对UPDLOCK也不起作用。如果你使用UPDLOCK,500人将无法投票…我想你需要在打电话给SP之前检查一下。顺便说一句:SP非常简单:更新投票数\u表集合投票数=投票数+1,其中投票数\u Id=I\u投票数\u Id-1这是胡说八道。不能仅仅因为在某些特定情况下,数据库中有逻辑更好地工作,就假设业务规则在所有情况下都是不好的。在应用程序中使用业务逻辑比管理存储过程容易得多。您得到了更易于测试和版本控制的东西。