由于没有注意到EF事务的默认隔离级别是Serializable,(据说EF6.0以后默认隔离级别改成了Read_Commit_Snapshot)--这里有误,应该是加了TransactionScope以后的级别,EF默认应该是Read_Commit级别。 而后在Production环境中产生了很多Deadlock的错误。

重现

首先两个Session中分别执行个Update 获得X锁

可以通过语句查询锁的状态如下:

接着在非主键列上执行查询,查询计划是全表扫描

会发现第一个session中需要的资源980b829163df被占据,无法放置S锁

如果这个时候第二个session执行一次全表扫描的话,dead lock就诞生了。

分析

Serializable是一个并发性相当低的隔离级别,一般程序都不需要设置到这个级别。

问题代码:

在一个大的事务中有update获得X锁,同时又有未建立索引的全表扫描。

只要同时有两个Session获得了X锁,触发deadlock.

原因有好几个:

1 隔离级别太高

2 事务太复杂

3 并发度较高

解决方案

1 拆分事务

确定真的需要如此大的事务么

2降低隔离级别

读的部分采用read uncommit级别这里可以

3 在相应表上建立相应的非聚集索引,避免全表扫描的查询计划。

最新文章

  1. [Asp.net 5] Localization-简单易用的本地化
  2. mysql数据库的备份与恢复
  3. python错误类型
  4. JAVA文件下载功能问题解决日志
  5. javaIO-学习笔记
  6. 使用SQLIO测试磁盘性能
  7. quartz 数据表字典
  8. [置顶] Datalist嵌套datalist,页面传值,加密,数据绑定
  9. 经验总结17--submitbutton,ajax提交
  10. 使用约束给tableview添加暂无数据的提示
  11. storm serializable
  12. va_start,va_arg,va_end的使用
  13. JS的进阶技巧
  14. R语言修改标题、坐标轴刻度、坐标轴名称的大小(cex.axis、cex.lab、cex.main函数)
  15. oracle 老用户数据导入新建用户
  16. [No0000157].net core项目中拼音,excel,pdf处理库
  17. 调用 TBrowseForFolder 的正确姿势
  18. Laravel 5.4+Vue.js 初体验:Laravel下配置运行Vue.js
  19. 源码安装natcat
  20. Oracle SEQUENCE 具体说明

热门文章

  1. Sql Server中启用分布式事务小结
  2. PHP大批量插入数据库的3种方法和速度对比
  3. TFS2008解除独占式锁定文件命令(转载)
  4. 【iOS】app的生命周期
  5. 新浪微博客户端(18)-集成下拉刷新控件UIRefreshControl
  6. C++中的异常处理(二)
  7. Gulp, 比Grunt更好用的前端构建工具
  8. 百度站长工具进击site结果页面[SITE特型]
  9. Eighth scrum meeting - 2015/11/2
  10. HNU 12826 Balloons Colors