我有一个连接到远程数据库的.net客户端应用程序.在客户的整个生命周期内保持单个连接打开是否安全(小时)?
如果我有多个(10或100)客户端运行,答案是否成立?
谢谢
我在MySQL中找不到乐观锁定的任何细节.我读到,启动事务会保持同步的两个实体的更新,但是它不会阻止两个用户同时更新数据而导致冲突.
显然乐观锁定会解决这个问题吗?这是如何在MySQL中应用的.这有SQL语法/关键字吗?或者MySQL有默认行为吗?
多谢你们.
我知道我无法锁定单个mongodb文档,实际上也无法锁定集合.
但是,我有这种情况,我认为我需要一些方法来防止多个线程(或进程,这并不重要)修改文档.这是我的情景.
我有一个包含类型A的对象的集合.我有一些代码检索类型A的文档,在数组中添加元素作为document(a.arr.add(new Thing())的属性,然后将文档保存回mongodb.这段代码是并行的,我的应用程序中的多个线程可以执行这些操作,现在没有办法阻止线程在同一文档上并行执行这些操作.这很糟糕,因为其中一个线程可能会覆盖另一个线程的工作.
我确实使用存储库模式来抽象对mongodb集合的访问,所以我只处理我的处理中的CRUD操作.
现在我考虑一下,也许这是对存储库模式的限制,而不是mongodb的限制导致我的麻烦.无论如何,我怎样才能使这段代码"线程安全"?我想这个问题有一个众所周知的解决方案,但是对mongodb和存储库模式不熟悉,我不会马上看到它.
谢谢
所以我刚刚意识到PHP可能同时运行多个请求.昨晚的日志似乎显示有两个请求进入,并行处理; 每个触发从另一个服务器导入数据; 每个都试图将记录插入数据库.当它试图插入另一个线程刚刚插入一条记录的一个请求失败(导入的数据自带的PK,我没有使用递增的ID): SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '865020' for key 'PRIMARY' ....
以下是一些代码.我已经删除了大部分内容(日志记录,从数据中创建患者以外的其他实体),但以下内容应包括相关的代码段.请求命中了import()方法,该方法基本上为每个要导入的记录调用importOne().注意importOne()中的save方法; 这是一个Eloquent方法(使用Laravel和Eloquent),它将生成SQL以适当地插入/更新记录.
public function import()
{
$now = Carbon::now();
// Get data from the other server in the time range from last import to current import
$calls = $this->getCalls($this->getLastImport(), $now);
// For each call to import, insert it into the DB (or update if it already exists)
foreach ($calls as $call) {
$this->importOne($call);
}
// Update the last import time to now …Run Code Online (Sandbox Code Playgroud) 假设我正在做这样的事情(来自Active Record Querying指南)
Item.transaction do
i = Item.first(:lock => true)
i.name = 'Jones'
i.save
end
Run Code Online (Sandbox Code Playgroud)
是否在交易结束时自动释放锁定?我查看了Active Query指南和ActiveRecord :: Locking :: Pessimistic文档,但无法找到明确说明锁定释放位置的位置.
当某个其他用户在update_object视图中处于活动状态时,我想在用户尝试删除对象时引发错误.我觉得需要某种类似互斥锁的机制.你有什么建议吗?
我对我们使用的目的有疑问SELECT FOR UDPATE?它究竟做了什么?
我有表,我需要从表中选择行并更新相同的行.
例如:
选择查询
SELECT * from t1 WHERE city_id=2 for update
Run Code Online (Sandbox Code Playgroud)
更新查询
UPDATE t1 SET final_balance = final_balance - 100 WHERE city_id ='2'
Run Code Online (Sandbox Code Playgroud)
我的问题 - 这是否真的锁定了读取操作,直到我的更新完成,或者它究竟处理了什么?
我的想法是,在我的更新完成之前,没有人无法从此行读取/更新.
谢谢!
我最近在PHP上做了一些Web开发工作,这使我一直在学习语言.到目前为止,我不需要使用它来与数据库进行交互,但我知道它提供了许多方便的功能.
虽然我知道基本的SQL并且已经在数据库中使用数据的基本操作,但我不明白基于PHP/Javascript/SQL建立网站的Web开发人员能够管理同时修改相同数据的用户.
例如,假设您有一个二十一点网站,用户在注册时将用户划分为两个团队中的一个.每当用户赢得游戏时,他们的部分奖金将被添加到该团队的运行总计中.
那么让我们说这个函数的伪代码看起来像这样:
...
$total = mysql_query("SELECT score FROM team1");
$total = $total + $mytotal;
mysql_query("UPDATE team1 SET score='".$total."'");
...
Run Code Online (Sandbox Code Playgroud)
如果两个玩家同时玩,那么他们很有可能在另一个玩家有机会增加和更新表之前调用SELECT,因此一个用户的更改将立即被覆盖.
我的问题是,如何避免这种情况?它是在代码级使用PHP完成的,还是由您使用的任何数据库提供的功能有助于防止这种情况?
我一直在做一些研究,似乎PHP确实提供了信号量机制,我也注意到mysql提供了一个LOCK表功能.但是,我不确定在实践中使用哪一种,如果有的话.
情况:共享单个后端服务器(WCF RIA或其他Web服务)的多个前端(例如Silverlight,ASP).
我正在寻找一个标准,以防止多人编辑同一个表格.我知道这不是一个容易的主题,但要求是要求.
以前我使用DB上次修改日期来对提交的数据进行处理,如果数据在加载后被修改,则会发出警告或错误.初始系统只是在没有任何警告的情况下覆盖数据.问题是我有一个新的要求来防止这两种情况.会有很多UI,因此锁定系统可能是一个挑战,并且显然无法保证客户端不会在编辑过程中关闭窗口/浏览器.
我将不胜感激任何帮助.
我在Grails中遇到了一个问题,我认为这可能是如何处理并发性的潜在问题; 我不确定如何最好地处理这个问题(或者如果有一个解决方案/实践已经到位,我可以适应).
我的Grails应用程序用作REST API,并且具有数据的加密方法,该方法依赖于计数器变量作为密码的腌制机制.
这个计数器变量必须保持,并且不能低,因为数据将发送到发卡后不能修改计数器的SIM卡,因此正确维护此计数器非常重要.此外,如果计数器不正确,SIM将拒绝该消息.
例如,当用户呼叫时:http://example.tld/service/controller/action?id=1服务器将执行以下操作:
getcontroller带标识符的对象1counter对象的成员/行save 物体对于20,000多个请求,这很好.然而,两次,StaleObjectException由于在同一时间访问对象,我已经确定了一个.我已经确定这种情况正在发生,因为我提供的包装器API使用了10个线程,而且两个线程都同时调用了它action.
我已阅读并注意到我可以:
lock 对象 - 但我认为由于对象在第二次被访问时被锁定,它仍会引发异常? executeUpdate我认为类似于打开动态更新?在我的用例中可能没用.我想知道是否有一些我可以使用的交易机制?即一个方法来检查某个对象当前处于锁定状态,如果是这样,睡眠对于t允许交易在数据库中完成.
最终,我的最终目标是不拒绝任何请求,因此如果上面的事务机制存在(我假设将是某种悲观锁)并且所述事务机制在对象被锁定时拒绝请求,我宁愿其他一些解决方案因为我想不惜一切代价避免拒绝对服务的请求,因为它使先前交付给客户变得复杂.
我想到的当前解决方案是:
try {
Foo.save()
catch (RespectiveException ex) {
Thread.sleep(1000)
if(depth < 3) {
recursiveCallToThisMethod(depth++)
} else {
render(letTheUserKnowWhyItFailed)
}
}
Run Code Online (Sandbox Code Playgroud)
但是......非常难看
concurrency ×3
database ×3
locking ×2
mysql ×2
php ×2
.net ×1
c# ×1
django ×1
eloquent ×1
grails ×1
grails-orm ×1
hibernate ×1
innodb ×1
mongodb ×1
mutex ×1
optimistic ×1
pessimistic ×1
session ×1
silverlight ×1
sql ×1
transactions ×1
wcf ×1