我试图调试以下场景:有2个并发进程,将完全相同的行插入具有唯一约束的表中.这是在显式事务之外完成的(虽然我假设InnoDB将其作为单个语句处理内部自动提交?)
架构如下:
CREATE TABLE locks (
id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
lock_uid varchar(255) NOT NULL,
count smallint(6) NOT NULL,
processor_id varchar(255) DEFAULT NULL,
created_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
updated_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE INDEX locks_lock_uid_unique (lock_uid)
)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样lock_uid,在表中存在唯一的索引以防止具有相同值的多个行.
正在运行的命令(对于上下文,这些是从通用查询日志中获取以获得完整的健全性,在collation命令之外的任一线程上都没有其他语句):
线程1:
insert into `locks` (`lock_uid`, `count`, `processor_id`, `created_at`, `updated_at`)
values ('11161567', '0', NULL, '2017-11-07 10:46:36', '2017-11-07 10:46:36')
Run Code Online (Sandbox Code Playgroud)
线程2:
insert into `locks` (`lock_uid`, `count`, `processor_id`, `created_at`, `updated_at`)
values ('11161567', '0', NULL, …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的页面(我已将其减少到几乎没有内容,以查看是否可以使其正常工作)。使用Html.TextBoxFor如下所示的 lambda调用时抛出 NullReferenceException 。我想弄清楚这是为什么?
异常本身似乎已被处理,因为它不会停止呈现页面,但我认为它根本不应该发生?文本框实际上按预期正确呈现(使用正则表达式和占位符)。
如果我换TextBoxFor了PasswordFor一个 NullReferenceException 也不会抛出。
看法:
@model Analytics.Sites.Frontend.Models.RegisterViewModel
<div>
@using (Html.BeginForm("Register", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "centeralign", role = "form" }))
{
@Html.TextBoxFor(m => m.Email, new { @placeholder = "email@address.com" })
}
</div>
Run Code Online (Sandbox Code Playgroud)
视图模型
public class RegisterViewModel
{
[Required]
[Display(Name = "Email")]
[DataType(DataType.EmailAddress)]
[RegularExpression(@"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$", ErrorMessage = "The email address you entered is not valid.")]
public string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
例外:
System.NullReferenceException …Run Code Online (Sandbox Code Playgroud) 我很困惑如何最好地处理这种情况.我不想等待异步调用的响应.具体来说,我有:
public async Task<IApiData> FetchQueuedApiAsync(TimeSpan receiveTimeout)
{
var message = await Task.Factory.FromAsync<Message>(
ReadQueue.BeginReceive(receiveTimeout), ReadQueue.EndReceive);
return message.Body as IApiData;
}
Run Code Online (Sandbox Code Playgroud)
这按预期工作.但是,如果超时到期,则不得调用ReadQueue.EndReceive,否则将引发异常.显然,FromAsync并不知道这一点并盲目地调用它 - 解雇异常.不要在超时时调用EndReceive的要求由MSMQ实现,超出了我的控制范围.
当消息准备就绪或发生超时时,队列会公开事件.这是您通常检查消息是否存在的地方,然后根据文档调用EndReceive.标准听众......
ReadQueue.ReceiveCompleted += ReadQueue_ReceiveCompleted;
Run Code Online (Sandbox Code Playgroud)
我的问题是,我不明白如何做到这一点,仍然有这样的等待(即我希望能够等待我现在,但通过委托处理它).那有意义吗?
在我看来,我应该能够做到这一点?但我不能.
public Dictionary<Type, List<ParserRuleContext>> Contexts { get; private set; }
public IEnumerable<T> GetAllContextsOfType<T>() where T:ParserRuleContext
{
return (List<T>)Contexts[typeof(T)];
}
Run Code Online (Sandbox Code Playgroud)
这会产生错误:
Cannot convert type 'System.Collections.Generic.List<ParserRuleContext>'
to 'System.Collections.Generic.List<T>'
Run Code Online (Sandbox Code Playgroud)
鉴于List被子句限制为List <ParserRuleContext>,我不明白这个?
我不知道发生了什么事.我有一张叫做的桌子project_share_invite.几个小时前(在我们的生产环境中)我不能再对这个表发出SELECT.MySQL声称该表不存在,尽管它显示在上面show tables.今天在机器上发生的唯一值得注意的事件是例行程序包升级(通过apt).
mysql> use analytics;
Database changed
mysql> show tables like 'project_share_invite';
+--------------------------------------------+
| Tables_in_analytics (project_share_invite) |
+--------------------------------------------+
| project_share_invite |
+--------------------------------------------+
1 row in set (0.00 sec)
mysql> select count(*) from project_share_invite;
ERROR 1146 (42S02): Table 'analytics.project_share_invite' doesn't exist
Run Code Online (Sandbox Code Playgroud)
想法?这对我没有任何意义.
更新:表的文件仍然存在于磁盘上(project_share_invite.frm并project_share_invite.idb分别)并且其中包含内容.
MySQL的快速重启并没有解决这个问题.
更新:使用root帐户而不是特定用户帐户时的结果相同.
更新:我也无法重新创建表.
CREATE TABLE `analytics`.`project_share_invite` ( ... )
ERROR 1146 (42S02): Table 'analytics.project_share_invite' doesn't exist
Run Code Online (Sandbox Code Playgroud)
更新:应该先检查错误日志:
InnoDB: Load table 'analytics/project_share_invite' failed, the table has missing foreign key indexes.
Run Code Online (Sandbox Code Playgroud)
虽然我不知道它是如何在这种状态下得到的.
c# ×3
mysql ×2
asp.net ×1
asp.net-mvc ×1
asynchronous ×1
deadlock ×1
generics ×1
msmq ×1
razor ×1