文档章节

读写分离死锁解决方案、事务发布死锁解决方案、发布订阅死锁解决方案

浩爷
 浩爷
发布于 2016/06/15 18:02
字数 725
阅读 1445
收藏 41

前言:

        由于网站访问压力的问题,综合分析各种因素后结合实际情况,采用数据库读写分离模式来解决当前问题。实际方案中采用“事务发布”模式实现主数据库和只读数据库的同步,其中:

    发布服务器1台:sql2008,推送订阅模式

    订阅服务器2台:sql2008

问题:

        以上方案后实施后,数据同步正常,但从日志中发现了死锁情况。错误提示如:事务(进程 ID *)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

查询一些资料后,确定是数据同步的同时资源被锁,同时用户访问页面请求,导致死锁产生,按照事务优先级,应用程序产生死锁。

解决方法:

        找到大致思路后,查询了一些资料,大部分资料显示是死锁如何产生,如果跟踪日志,然后根据日志优化查询等方向,尝试一些方案后死锁减少,但并没有彻底解决,最后转换思路,从项目实际情况来看,主要是资讯信息的查询,对查询结果的安全性要求相对不高,所以可以接受“脏”数据的情况,在某种情况下又能提升查询的性能,于是在一些查询频繁和数据量比较大的几个表的select语句中加入with(nolock),死锁问题彻底解决。

 

建议:

        处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAST,对于非银行等严格要求事务的行业,搜索记录中出现或者不出现某条记录,都是在可容忍范围内,所以碰到死锁,应该首先考虑,我们业务逻辑是否能容忍出现或者不出现某些记录,而不是寻求对双方都加锁条件下如何解锁的问题。

NOLOCK 和 READPAST 都是处理查询、插入、删除等操作时候,如何应对锁住的数据记录。但是这时候一定要注意NOLOCK 和 READPAST的局限性,确认你的业务逻辑可以容忍这些记录的出现或者不出现: 
简单来说:

NOLOCK 可能把没有提交事务的数据也显示出来.

READPAST 会把被锁住的行不显示出来 

不使用 NOLOCK 和 READPAST ,在 Select 操作时候则有可能报错误:事务(进程 ID **)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。 

 

做此记录,希望给遇到同样的问题的朋友一些帮助。

© 著作权归作者所有

共有 人打赏支持
浩爷

浩爷

粉丝 7
博文 90
码字总数 49238
作品 0
深圳
程序员
私信 提问
加载中

评论(2)

浩爷
浩爷

引用来自“云豹直播”的评论

不错谢谢
互相学习!
云豹直播
云豹直播
不错谢谢
SQL Server 死锁问题的分析

一、什么是死锁? 简单来说,我和你,金锁和银锁。 我拿着金锁,我需要再拿到银锁,才能完成任务, 你拿着银锁,你需要再拿到金锁,才能完成任务。 我拿不到银锁,你拿不到金锁,这就形成死锁...

全部原谅
07/02
0
0
MySQL 出现死锁的分析和解决方案

异常日志 ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transactio......

黄途文
2015/07/16
0
3
【MYSQL死锁问题】Deadlock found when trying to get lock;

问题: 在多访问的情况下,一个删除计划的操作会出现死锁现象,报错如下: 解决方案: 此删除涉及到事物,在删除计划的过程中,还要删除立项信息、合同需求信息关联的计划信息。在删除开始之...

卯金刀GG
12/06
0
0
数据库常见死锁原因及处理

数据库是一个多用户使用的共享资源,当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一...

登录404
2017/07/11
621
2
【Java基础】线程同步教程

线程同步 线程同步是指多个线程对同一资源(同一对象、同一变量等)进行操作,就会产生线程同步的问题。 如下: package org.zhanghua.javase.demo.thread; /** * 线程同步演示 * * @author ...

Auhgnahz
2015/12/22
17
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
17
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
10
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部