sqlserver2008 r2 并发情况下,概率性出现select和update失败

freshman45 2018-03-22 12:23:03
sqlserver2008 r2数据库,在thinkphp的框架下开发接口给 app调用,在并发的情况下,会概率性出现select或者update失败,
数据库未做特别设置,请帮忙分析下
...全文
491 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-03-26
  • 打赏
  • 举报
回复
引用 11 楼 freshman45 的回复:
[quote=引用 10 楼 yenange 的回复:]

SELECT TOP(1) "col1","col2" 
FROM "table1" 
WHERE  "col3" = '1778847'

UPDATE "table1"
SET    "status"        = '7',
       "last_time"     = '2018-03-22 18:14:34'
WHERE  "col3"          = '1773186'
       AND "status" >= 3
--------------- 以上是死锁的SQL -----------------

--------------- 以下是解决方案 -----------------
--1. 查询这个表,不关系到钱或更新、删除(也就是纯查询),全部加上 with(nolock)
SELECT TOP 1 col1,col2 FROM table1 WITH(NOLOCK) WHERE col3='1778847'

--2. 创建索引,提高查询和删除的效率
CREATE INDEX ix_table1_col3_status ON table1([col3],[status]) INCLUDE(col1,col2)
你好:select不会出现资源锁的问题,后面发现update概率性的会出现资源锁的问题了,大神这个如何解[/quote] 你先告诉我什么叫资源锁? 你怎么知道出现了资源锁?
freshman45 2018-03-25
  • 打赏
  • 举报
回复
引用 10 楼 yenange 的回复:

SELECT TOP(1) "col1","col2" 
FROM "table1" 
WHERE  "col3" = '1778847'

UPDATE "table1"
SET    "status"        = '7',
       "last_time"     = '2018-03-22 18:14:34'
WHERE  "col3"          = '1773186'
       AND "status" >= 3
--------------- 以上是死锁的SQL -----------------

--------------- 以下是解决方案 -----------------
--1. 查询这个表,不关系到钱或更新、删除(也就是纯查询),全部加上 with(nolock)
SELECT TOP 1 col1,col2 FROM table1 WITH(NOLOCK) WHERE col3='1778847'

--2. 创建索引,提高查询和删除的效率
CREATE INDEX ix_table1_col3_status ON table1([col3],[status]) INCLUDE(col1,col2)
你好:select不会出现资源锁的问题,后面发现update概率性的会出现资源锁的问题了,大神这个如何解
吉普赛的歌 2018-03-22
  • 打赏
  • 举报
回复
发一下失败的错误信息
吉普赛的歌 2018-03-22
  • 打赏
  • 举报
回复

SELECT TOP(1) "col1","col2" 
FROM "table1" 
WHERE  "col3" = '1778847'

UPDATE "table1"
SET    "status"        = '7',
       "last_time"     = '2018-03-22 18:14:34'
WHERE  "col3"          = '1773186'
       AND "status" >= 3
--------------- 以上是死锁的SQL -----------------

--------------- 以下是解决方案 -----------------
--1. 查询这个表,不关系到钱或更新、删除(也就是纯查询),全部加上 with(nolock)
SELECT TOP 1 col1,col2 FROM table1 WITH(NOLOCK) WHERE col3='1778847'

--2. 创建索引,提高查询和删除的效率
CREATE INDEX ix_table1_col3_status ON table1([col3],[status]) INCLUDE(col1,col2)
freshman45 2018-03-22
  • 打赏
  • 举报
回复
2018-03-22 16:51:30:423390 get col1 fail $errorArray[0]:40001$errorArray[1]:1205$errorArray[2][Microsoft][ODBC Driver 11 for SQL Server][SQL Server]事务(进程 ID 58)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。 2018-03-22 16:51:30:423390 get col1 fail sql:SELECT top (1) "col1","col2" FROM "table1" WHERE "col3" = '1778847' 2018-03-22 18:14:39:358953 update state fail $errorArray[0]:40001$errorArray[1]:1205$errorArray[2][Microsoft][ODBC Driver 11 for SQL Server][SQL Server]事务(进程 ID 52)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。 2018-03-22 18:14:39:358953 update state fail sql:UPDATE "table1" SET "status" = '7', "last_time" = '2018-03-22 18:14:34' WHERE "col3" = '1773186' AND "status" >= 3
freshman45 2018-03-22
  • 打赏
  • 举报
回复
引用 5 楼 yenange 的回复:
把执行频繁的SQL发一下. 发实际最终执行的SQL出来 , 不要PHP代码。 相关表的表结构, 索引也发一下。
主要就操作一张表table1 字段名 a b c d e f,表table1 没有关联性 然后主要update,会对f进行更新,select的话,对a,b,c,d,e,f都有可能发生 可能出现在查询a的时候,有可能还进行update f的操作,这个时候,select或者update就概率性失败
吉普赛的歌 2018-03-22
  • 打赏
  • 举报
回复
引用 6 楼 freshman45 的回复:
[quote=引用 5 楼 yenange 的回复:] 把执行频繁的SQL发一下. 发实际最终执行的SQL出来 , 不要PHP代码。 相关表的表结构, 索引也发一下。
1、是否能再sqlserver里面通过查询分析器来查看死锁情况,用了一些语句查询没查到 2、sql语句就是查询一张表,然后其他接口,也会并发的去更改这张表,这边表与表的关系比较简单,没耦合[/quote] 发了再说吧。 如果觉得表名、列名敏感, 可以用 tableName, col1, col2 等代替。
freshman45 2018-03-22
  • 打赏
  • 举报
回复
引用 5 楼 yenange 的回复:
把执行频繁的SQL发一下. 发实际最终执行的SQL出来 , 不要PHP代码。 相关表的表结构, 索引也发一下。
1、是否能再sqlserver里面通过查询分析器来查看死锁情况,用了一些语句查询没查到 2、sql语句就是查询一张表,然后其他接口,也会并发的去更改这张表,这边表与表的关系比较简单,没耦合
吉普赛的歌 2018-03-22
  • 打赏
  • 举报
回复
把执行频繁的SQL发一下.
发实际最终执行的SQL出来 , 不要PHP代码。

相关表的表结构, 索引也发一下。
freshman45 2018-03-22
  • 打赏
  • 举报
回复
引用 3 楼 yenange 的回复:
medoo没用过, 看这个能不能记录错误日志:https://medoo.lvtao.net/doc.log.php 其它如.net, java 等都有非常方便记录日志的框架, 出了问题直接看日志就好了, 不用猜来猜去
获取到的错误类型就是如下,还是跟sqlserver有关,这方面有没有需要相关设置的 错误如下:

[ODBC Driver 11 for SQL Server][SQL Server]事务(进程 ID 58)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
吉普赛的歌 2018-03-22
  • 打赏
  • 举报
回复
medoo没用过, 看这个能不能记录错误日志:https://medoo.lvtao.net/doc.log.php 其它如.net, java 等都有非常方便记录日志的框架, 出了问题直接看日志就好了, 不用猜来猜去
freshman45 2018-03-22
  • 打赏
  • 举报
回复
引用 1 楼 yenange 的回复:
发一下失败的错误信息
你好,请问是查看哪里的错误信息,这边数据查询使用的是medoo,代码大概如下:
$sql_CodeNoItem = $db->get('d',array('a','b'),
            array(d' => $param['d']));
        if ($sql_CodeNoItem == false)
        {
            $return['status'] = RETURN_FAIL;
            app_log('error', $db->last_query());
            return $return;
        }
查看了执行的sql,语法没错误,并且可以再查询分析器可以正常执行

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧