并发操作造成数据库死锁 网站用户越多越卡 怎么解决?

时间:2021-07-01 21:41:02
我在程序的Application_BeginRequest 里面加入了一个用户在那个页面的记录

直接update一个online表 

当用户多的时候 可能因为并发的操作太多 就造成数据库的死锁 

怎么来处理这个事情呢?

我的sql语句很简单的 就只是一个update 而已 

现在网站人一多就好卡

24 个解决方案

#1


那就给数据库加一个更新锁

#2


加更新锁是什么意思 具体怎么做?

还有我的sql语句就一个update 是不是也要加上 commit   or   rollback    这样才能防止死锁?

#3


你说的这个多是个什么概念?

平均多少?

#4


up

#5


Application.Lock()
代码
Application.UnLock()
检测在线或着用session事件来判断。虽然有差距。不过可以提高一点效率吧。
或着把你的时间检测时间设长一点看先。

#6


更新数据库的存储过程的一开始就开始事务begin tran 执行完成就提交commit tran
这样能避免死锁

#7


如果你使用SQL Server,那么即使你使用transaction,SQL Server也会自动在SQL命令中启动事物,所以再额外增加一个事务的做法没有意义。Application.Lock()则更是雪上加霜。

你要测试你的事务是否在1、2秒钟内都能结束,如果不能,应该研究为什么你的update这么慢,例如你是否没有使用索引去查找,你是否应该将同步触发器改为异步执行的程序。

#8


那么即使你使用transaction  -->  那么即使你不使用transaction

#9


查一查 update 的效率,如果update 慢,你需要优化你的数据库。在线一般不会超过10W吧,10W以下的表,插入应该非常快的,如果比较慢,你查查这方面的原因。

#10


我的update非常简单啊 单独拿出来速度肯定非常快

我现在只能是猜测是并发造成锁死的

想找出原因 确没有好的办法 怎么才能找到锁死的地方或者原因呢?

#11


什么叫做“速度肯定非常快”?“单独拿出来”测试,那么你的感觉能够精确到几十毫秒吗?

#12


如果是SQL Server,你仅仅执行一条update命令,锁记录是逻辑正常的,不正常的只有可能是查找定位记录的速度太慢造成锁的时间过长。

#13


绝招是先保存在内存里面,等到记录比较多的时候在一次性写入物理记录,更好的还可以定时操作

#14


to sp1234(脸上不少死皮) 

感觉非常快的意思是说 那个update语句很简单 所操作的表也很简单 而且记录不是很多

我的意思主要是想找到这种死锁问题的方法 和一般解决办法 

我现在网站有时候sqlserver的cpu占用很高 经常造成网站访问非常卡

应该怎么解决呢?从那方面入手解决呢?

#15


1.用缓存
2.用事件探查器来看看哪些查询语句耗资源,然后优化查询
3.给数据库服务器加cpu,加内存

#16


慢也不一定就是那条UPDATE语句造成的,也许你的程序里其它地方代码有问题,一个很典型的例子就是连接池满了,检查一下是否所有的连接都显示的关闭或Dispose了。
另外,还可以用缓存来减少数据库的压力。其实用户所在页面也不需要非常实时,可以考虑换种方式,把用户在线列表放到缓存中,每个请求只更新缓存中的数据,然后定个时间,比如5秒,把缓存中的在线列表更新到数据库,这样就不需要每次都向数据库里请求更新了。

#17


我的update非常简单啊 单独拿出来速度肯定非常快

我现在只能是猜测是并发造成锁死的

想找出原因 确没有好的办法 怎么才能找到锁死的地方或者原因呢?
------------------------------------------------------------------
看看 Update语句是否异常,在数据库里有没有为每一个用户分配一条记录?
你应该为每个用户分配一条记录,然后再更新这条记录。
更新尽量用存储过程。
下一个数据库压力测试工具,看看你的数据库是不是真的很快;

#18


c#自带了事务啊
可以使用sqltransaction类啊,用法和transaction差不多,然后使用lock语句锁一下就好了
个人意见,没有试过

#19


我看楼主对“死锁”的概念用的比较宽泛,把速度慢都叫做死锁,并不是真的update异常。

在数据量很大,而操作仅仅是更新一条记录这么简单的时候,似乎只有索引问题才会如此。有能够用的索引,当数据从1000条增加到100万条的时候,也仅仅多花几倍的时间,而没有能够用的索引则会多花几十万倍的时间查找定位。

你可以使用线程将记录操作变为异步的,这可以让程序看起来快很多。但是如果不解决结构问题,你的服务器整体性能很低,最终也还是不好。

#20


我的数据库链接池 没有几个很少 一般保持在4-6个 

事件探测器 没有费时的sql语句

死锁的概念可能我理解错了 但是在sqlserver管理器中的 锁/id 里面有很多条 大部分都是online表的sql语句 一般是 delete from online where sessionid='XXXXX' 
这个表主要就是添加 删除 和select 而且 极少有可能同时添加 删除 select的 

我现在就是不知道系统到底是那里的事情 为啥经常卡 cpu 一般都是忽高忽低 偶尔还会cpu到100好长时间不下来

郁闷的很啊 除了数据库死锁的问题 实在是找不到其他的问题了

服务器ping值都是<=1ms 的 啊

#21


uuuppp

#22


这问题好,关注ing~~~

#23


mark
有意思

#24


学习
mark

#1


那就给数据库加一个更新锁

#2


加更新锁是什么意思 具体怎么做?

还有我的sql语句就一个update 是不是也要加上 commit   or   rollback    这样才能防止死锁?

#3


你说的这个多是个什么概念?

平均多少?

#4


up

#5


Application.Lock()
代码
Application.UnLock()
检测在线或着用session事件来判断。虽然有差距。不过可以提高一点效率吧。
或着把你的时间检测时间设长一点看先。

#6


更新数据库的存储过程的一开始就开始事务begin tran 执行完成就提交commit tran
这样能避免死锁

#7


如果你使用SQL Server,那么即使你使用transaction,SQL Server也会自动在SQL命令中启动事物,所以再额外增加一个事务的做法没有意义。Application.Lock()则更是雪上加霜。

你要测试你的事务是否在1、2秒钟内都能结束,如果不能,应该研究为什么你的update这么慢,例如你是否没有使用索引去查找,你是否应该将同步触发器改为异步执行的程序。

#8


那么即使你使用transaction  -->  那么即使你不使用transaction

#9


查一查 update 的效率,如果update 慢,你需要优化你的数据库。在线一般不会超过10W吧,10W以下的表,插入应该非常快的,如果比较慢,你查查这方面的原因。

#10


我的update非常简单啊 单独拿出来速度肯定非常快

我现在只能是猜测是并发造成锁死的

想找出原因 确没有好的办法 怎么才能找到锁死的地方或者原因呢?

#11


什么叫做“速度肯定非常快”?“单独拿出来”测试,那么你的感觉能够精确到几十毫秒吗?

#12


如果是SQL Server,你仅仅执行一条update命令,锁记录是逻辑正常的,不正常的只有可能是查找定位记录的速度太慢造成锁的时间过长。

#13


绝招是先保存在内存里面,等到记录比较多的时候在一次性写入物理记录,更好的还可以定时操作

#14


to sp1234(脸上不少死皮) 

感觉非常快的意思是说 那个update语句很简单 所操作的表也很简单 而且记录不是很多

我的意思主要是想找到这种死锁问题的方法 和一般解决办法 

我现在网站有时候sqlserver的cpu占用很高 经常造成网站访问非常卡

应该怎么解决呢?从那方面入手解决呢?

#15


1.用缓存
2.用事件探查器来看看哪些查询语句耗资源,然后优化查询
3.给数据库服务器加cpu,加内存

#16


慢也不一定就是那条UPDATE语句造成的,也许你的程序里其它地方代码有问题,一个很典型的例子就是连接池满了,检查一下是否所有的连接都显示的关闭或Dispose了。
另外,还可以用缓存来减少数据库的压力。其实用户所在页面也不需要非常实时,可以考虑换种方式,把用户在线列表放到缓存中,每个请求只更新缓存中的数据,然后定个时间,比如5秒,把缓存中的在线列表更新到数据库,这样就不需要每次都向数据库里请求更新了。

#17


我的update非常简单啊 单独拿出来速度肯定非常快

我现在只能是猜测是并发造成锁死的

想找出原因 确没有好的办法 怎么才能找到锁死的地方或者原因呢?
------------------------------------------------------------------
看看 Update语句是否异常,在数据库里有没有为每一个用户分配一条记录?
你应该为每个用户分配一条记录,然后再更新这条记录。
更新尽量用存储过程。
下一个数据库压力测试工具,看看你的数据库是不是真的很快;

#18


c#自带了事务啊
可以使用sqltransaction类啊,用法和transaction差不多,然后使用lock语句锁一下就好了
个人意见,没有试过

#19


我看楼主对“死锁”的概念用的比较宽泛,把速度慢都叫做死锁,并不是真的update异常。

在数据量很大,而操作仅仅是更新一条记录这么简单的时候,似乎只有索引问题才会如此。有能够用的索引,当数据从1000条增加到100万条的时候,也仅仅多花几倍的时间,而没有能够用的索引则会多花几十万倍的时间查找定位。

你可以使用线程将记录操作变为异步的,这可以让程序看起来快很多。但是如果不解决结构问题,你的服务器整体性能很低,最终也还是不好。

#20


我的数据库链接池 没有几个很少 一般保持在4-6个 

事件探测器 没有费时的sql语句

死锁的概念可能我理解错了 但是在sqlserver管理器中的 锁/id 里面有很多条 大部分都是online表的sql语句 一般是 delete from online where sessionid='XXXXX' 
这个表主要就是添加 删除 和select 而且 极少有可能同时添加 删除 select的 

我现在就是不知道系统到底是那里的事情 为啥经常卡 cpu 一般都是忽高忽低 偶尔还会cpu到100好长时间不下来

郁闷的很啊 除了数据库死锁的问题 实在是找不到其他的问题了

服务器ping值都是<=1ms 的 啊

#21


uuuppp

#22


这问题好,关注ing~~~

#23


mark
有意思

#24


学习
mark