文档章节

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

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

前言:

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

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

    订阅服务器2台:sql2008

问题:

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

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

解决方法:

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

 

建议:

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

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

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

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

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

 

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

© 著作权归作者所有

共有 人打赏支持
浩爷

浩爷

粉丝 6
博文 88
码字总数 46918
作品 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
数据库常见死锁原因及处理

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

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

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

Auhgnahz
2015/12/22
17
0
java面试常用问题

MYSQL一个语句很慢,怎么调优法? 因为问题是调优,也就是基本不能改变整体的现有实现。下面分析慢的原因并给出对应可能正确的解决方案 1、SQL语句本身的优化,比如去掉不必要的排序等。 2、...

ovirtKg
2016/12/02
24
0

没有更多内容

加载失败,请刷新页面

加载更多

打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
4
0
搞定Northwind示例数据库,无论哪个版本的SQLServer都受用

Northwind数据库 从这里可以找到突破口: http://social.msdn.microsoft.com/Forums/zh-CN/Vsexpressvb/thread/8490a1c6-9018-40c9-aafb-df9f79d29cde 下面是MSDN: http://msdn2.microsoft......

QQZZFT
昨天
1
0
mysql主从同步,安装配置操作

准备 两台mysql服务,我这里准备了如下: 主库:192.168.176.128 从库:192.168.176.131 如何在Linux上安装mysql服务,请看https://blog.csdn.net/qq_18860653/article/details/80250499 操作...

小致dad
昨天
4
0
一个手机装天下,走遍中国都不怕!

导读 “1200元(人民币,下同),微信支付,可以,你扫我。”来自西非马里共和国的展商Albert拿着手机,和一位买走他手鼓的中国游客用简单的汉语交流着。 近日,“第十四届中俄蒙经贸洽谈暨商品...

问题终结者
昨天
3
0
Redis的“死键”问题

大规模的数据库存储系统中,数据的生命周期管理是很有必要的;从业务角度发现过期数据,数据归档和数据碎片整理等。以MySQL为例,1个运行很久的TB级MySQL实例中,极有可能数百GB的数据,对业...

IT--小哥
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部