直接update一个online表
当用户多的时候 可能因为并发的操作太多 就造成数据库的死锁
怎么来处理这个事情呢?
我的sql语句很简单的 就只是一个update 而已
现在网站人一多就好卡
24 个解决方案
#1
那就给数据库加一个更新锁
#2
加更新锁是什么意思 具体怎么做?
还有我的sql语句就一个update 是不是也要加上 commit or rollback 这样才能防止死锁?
还有我的sql语句就一个update 是不是也要加上 commit or rollback 这样才能防止死锁?
#3
你说的这个多是个什么概念?
平均多少?
平均多少?
#4
up
#5
Application.Lock()
代码
Application.UnLock()
检测在线或着用session事件来判断。虽然有差距。不过可以提高一点效率吧。
或着把你的时间检测时间设长一点看先。
代码
Application.UnLock()
检测在线或着用session事件来判断。虽然有差距。不过可以提高一点效率吧。
或着把你的时间检测时间设长一点看先。
#6
更新数据库的存储过程的一开始就开始事务begin tran 执行完成就提交commit tran
这样能避免死锁
这样能避免死锁
#7
如果你使用SQL Server,那么即使你使用transaction,SQL Server也会自动在SQL命令中启动事物,所以再额外增加一个事务的做法没有意义。Application.Lock()则更是雪上加霜。
你要测试你的事务是否在1、2秒钟内都能结束,如果不能,应该研究为什么你的update这么慢,例如你是否没有使用索引去查找,你是否应该将同步触发器改为异步执行的程序。
你要测试你的事务是否在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占用很高 经常造成网站访问非常卡
应该怎么解决呢?从那方面入手解决呢?
感觉非常快的意思是说 那个update语句很简单 所操作的表也很简单 而且记录不是很多
我的意思主要是想找到这种死锁问题的方法 和一般解决办法
我现在网站有时候sqlserver的cpu占用很高 经常造成网站访问非常卡
应该怎么解决呢?从那方面入手解决呢?
#15
1.用缓存
2.用事件探查器来看看哪些查询语句耗资源,然后优化查询
3.给数据库服务器加cpu,加内存
2.用事件探查器来看看哪些查询语句耗资源,然后优化查询
3.给数据库服务器加cpu,加内存
#16
慢也不一定就是那条UPDATE语句造成的,也许你的程序里其它地方代码有问题,一个很典型的例子就是连接池满了,检查一下是否所有的连接都显示的关闭或Dispose了。
另外,还可以用缓存来减少数据库的压力。其实用户所在页面也不需要非常实时,可以考虑换种方式,把用户在线列表放到缓存中,每个请求只更新缓存中的数据,然后定个时间,比如5秒,把缓存中的在线列表更新到数据库,这样就不需要每次都向数据库里请求更新了。
另外,还可以用缓存来减少数据库的压力。其实用户所在页面也不需要非常实时,可以考虑换种方式,把用户在线列表放到缓存中,每个请求只更新缓存中的数据,然后定个时间,比如5秒,把缓存中的在线列表更新到数据库,这样就不需要每次都向数据库里请求更新了。
#17
我的update非常简单啊 单独拿出来速度肯定非常快
我现在只能是猜测是并发造成锁死的
想找出原因 确没有好的办法 怎么才能找到锁死的地方或者原因呢?
------------------------------------------------------------------
看看 Update语句是否异常,在数据库里有没有为每一个用户分配一条记录?
你应该为每个用户分配一条记录,然后再更新这条记录。
更新尽量用存储过程。
下一个数据库压力测试工具,看看你的数据库是不是真的很快;
我现在只能是猜测是并发造成锁死的
想找出原因 确没有好的办法 怎么才能找到锁死的地方或者原因呢?
------------------------------------------------------------------
看看 Update语句是否异常,在数据库里有没有为每一个用户分配一条记录?
你应该为每个用户分配一条记录,然后再更新这条记录。
更新尽量用存储过程。
下一个数据库压力测试工具,看看你的数据库是不是真的很快;
#18
c#自带了事务啊
可以使用sqltransaction类啊,用法和transaction差不多,然后使用lock语句锁一下就好了
个人意见,没有试过
可以使用sqltransaction类啊,用法和transaction差不多,然后使用lock语句锁一下就好了
个人意见,没有试过
#19
我看楼主对“死锁”的概念用的比较宽泛,把速度慢都叫做死锁,并不是真的update异常。
在数据量很大,而操作仅仅是更新一条记录这么简单的时候,似乎只有索引问题才会如此。有能够用的索引,当数据从1000条增加到100万条的时候,也仅仅多花几倍的时间,而没有能够用的索引则会多花几十万倍的时间查找定位。
你可以使用线程将记录操作变为异步的,这可以让程序看起来快很多。但是如果不解决结构问题,你的服务器整体性能很低,最终也还是不好。
在数据量很大,而操作仅仅是更新一条记录这么简单的时候,似乎只有索引问题才会如此。有能够用的索引,当数据从1000条增加到100万条的时候,也仅仅多花几倍的时间,而没有能够用的索引则会多花几十万倍的时间查找定位。
你可以使用线程将记录操作变为异步的,这可以让程序看起来快很多。但是如果不解决结构问题,你的服务器整体性能很低,最终也还是不好。
#20
我的数据库链接池 没有几个很少 一般保持在4-6个
事件探测器 没有费时的sql语句
死锁的概念可能我理解错了 但是在sqlserver管理器中的 锁/id 里面有很多条 大部分都是online表的sql语句 一般是 delete from online where sessionid='XXXXX'
这个表主要就是添加 删除 和select 而且 极少有可能同时添加 删除 select的
我现在就是不知道系统到底是那里的事情 为啥经常卡 cpu 一般都是忽高忽低 偶尔还会cpu到100好长时间不下来
郁闷的很啊 除了数据库死锁的问题 实在是找不到其他的问题了
服务器ping值都是<=1ms 的 啊
事件探测器 没有费时的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
mark
#1
那就给数据库加一个更新锁
#2
加更新锁是什么意思 具体怎么做?
还有我的sql语句就一个update 是不是也要加上 commit or rollback 这样才能防止死锁?
还有我的sql语句就一个update 是不是也要加上 commit or rollback 这样才能防止死锁?
#3
你说的这个多是个什么概念?
平均多少?
平均多少?
#4
up
#5
Application.Lock()
代码
Application.UnLock()
检测在线或着用session事件来判断。虽然有差距。不过可以提高一点效率吧。
或着把你的时间检测时间设长一点看先。
代码
Application.UnLock()
检测在线或着用session事件来判断。虽然有差距。不过可以提高一点效率吧。
或着把你的时间检测时间设长一点看先。
#6
更新数据库的存储过程的一开始就开始事务begin tran 执行完成就提交commit tran
这样能避免死锁
这样能避免死锁
#7
如果你使用SQL Server,那么即使你使用transaction,SQL Server也会自动在SQL命令中启动事物,所以再额外增加一个事务的做法没有意义。Application.Lock()则更是雪上加霜。
你要测试你的事务是否在1、2秒钟内都能结束,如果不能,应该研究为什么你的update这么慢,例如你是否没有使用索引去查找,你是否应该将同步触发器改为异步执行的程序。
你要测试你的事务是否在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占用很高 经常造成网站访问非常卡
应该怎么解决呢?从那方面入手解决呢?
感觉非常快的意思是说 那个update语句很简单 所操作的表也很简单 而且记录不是很多
我的意思主要是想找到这种死锁问题的方法 和一般解决办法
我现在网站有时候sqlserver的cpu占用很高 经常造成网站访问非常卡
应该怎么解决呢?从那方面入手解决呢?
#15
1.用缓存
2.用事件探查器来看看哪些查询语句耗资源,然后优化查询
3.给数据库服务器加cpu,加内存
2.用事件探查器来看看哪些查询语句耗资源,然后优化查询
3.给数据库服务器加cpu,加内存
#16
慢也不一定就是那条UPDATE语句造成的,也许你的程序里其它地方代码有问题,一个很典型的例子就是连接池满了,检查一下是否所有的连接都显示的关闭或Dispose了。
另外,还可以用缓存来减少数据库的压力。其实用户所在页面也不需要非常实时,可以考虑换种方式,把用户在线列表放到缓存中,每个请求只更新缓存中的数据,然后定个时间,比如5秒,把缓存中的在线列表更新到数据库,这样就不需要每次都向数据库里请求更新了。
另外,还可以用缓存来减少数据库的压力。其实用户所在页面也不需要非常实时,可以考虑换种方式,把用户在线列表放到缓存中,每个请求只更新缓存中的数据,然后定个时间,比如5秒,把缓存中的在线列表更新到数据库,这样就不需要每次都向数据库里请求更新了。
#17
我的update非常简单啊 单独拿出来速度肯定非常快
我现在只能是猜测是并发造成锁死的
想找出原因 确没有好的办法 怎么才能找到锁死的地方或者原因呢?
------------------------------------------------------------------
看看 Update语句是否异常,在数据库里有没有为每一个用户分配一条记录?
你应该为每个用户分配一条记录,然后再更新这条记录。
更新尽量用存储过程。
下一个数据库压力测试工具,看看你的数据库是不是真的很快;
我现在只能是猜测是并发造成锁死的
想找出原因 确没有好的办法 怎么才能找到锁死的地方或者原因呢?
------------------------------------------------------------------
看看 Update语句是否异常,在数据库里有没有为每一个用户分配一条记录?
你应该为每个用户分配一条记录,然后再更新这条记录。
更新尽量用存储过程。
下一个数据库压力测试工具,看看你的数据库是不是真的很快;
#18
c#自带了事务啊
可以使用sqltransaction类啊,用法和transaction差不多,然后使用lock语句锁一下就好了
个人意见,没有试过
可以使用sqltransaction类啊,用法和transaction差不多,然后使用lock语句锁一下就好了
个人意见,没有试过
#19
我看楼主对“死锁”的概念用的比较宽泛,把速度慢都叫做死锁,并不是真的update异常。
在数据量很大,而操作仅仅是更新一条记录这么简单的时候,似乎只有索引问题才会如此。有能够用的索引,当数据从1000条增加到100万条的时候,也仅仅多花几倍的时间,而没有能够用的索引则会多花几十万倍的时间查找定位。
你可以使用线程将记录操作变为异步的,这可以让程序看起来快很多。但是如果不解决结构问题,你的服务器整体性能很低,最终也还是不好。
在数据量很大,而操作仅仅是更新一条记录这么简单的时候,似乎只有索引问题才会如此。有能够用的索引,当数据从1000条增加到100万条的时候,也仅仅多花几倍的时间,而没有能够用的索引则会多花几十万倍的时间查找定位。
你可以使用线程将记录操作变为异步的,这可以让程序看起来快很多。但是如果不解决结构问题,你的服务器整体性能很低,最终也还是不好。
#20
我的数据库链接池 没有几个很少 一般保持在4-6个
事件探测器 没有费时的sql语句
死锁的概念可能我理解错了 但是在sqlserver管理器中的 锁/id 里面有很多条 大部分都是online表的sql语句 一般是 delete from online where sessionid='XXXXX'
这个表主要就是添加 删除 和select 而且 极少有可能同时添加 删除 select的
我现在就是不知道系统到底是那里的事情 为啥经常卡 cpu 一般都是忽高忽低 偶尔还会cpu到100好长时间不下来
郁闷的很啊 除了数据库死锁的问题 实在是找不到其他的问题了
服务器ping值都是<=1ms 的 啊
事件探测器 没有费时的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
mark