社区
C#
帖子详情
C#多线程死锁的问题
janeone
2012-05-17 05:01:40
程序中 线程定义是这样的:开一个数据库连接,然后开启事务,事务的隔离级别设定为IsolationLevel.ReadCommitted,操作一张表,即向表中插入一条数据
然后线程池的大小定义为4,也就是同时能有4个线程一起跑
这样的定义下,会不会产生资源争夺 以及死锁的可能呢……
...全文
615
17
打赏
收藏
C#多线程死锁的问题
程序中 线程定义是这样的:开一个数据库连接,然后开启事务,事务的隔离级别设定为IsolationLevel.ReadCommitted,操作一张表,即向表中插入一条数据 然后线程池的大小定义为4,也就是同时能有4个线程一起跑 这样的定义下,会不会产生资源争夺 以及死锁的可能呢……
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
janeone
2012-05-21
打赏
举报
回复
[Quote=引用 15 楼 的回复:]
你说的这个情况,可能大部分情况下可能不会死锁,但如果下面情况就可能.
线程1处理 A , B
线程2处理 B, A
线程1在处理z执行完表A等待对表B进行操作,线程1锁定了表A,等待B的权限;而同一时刻线程2执行了表B的操作锁定了表B,等待表A的访问权限,这样就互相等待,死锁。
[/Quote]
但是我的线程里只操作一张表啊……没有表A,表B的情况……
karl012
2012-05-21
打赏
举报
回复
个人理解:
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
你说的这个情况,可能大部分情况下可能不会死锁,但如果下面情况就可能.
线程1处理 A , B
线程2处理 B, A
线程1在处理z执行完表A等待对表B进行操作,线程1锁定了表A,等待B的权限;而同一时刻线程2执行了表B的操作锁定了表B,等待表A的访问权限,这样就互相等待,死锁。
karl012
2012-05-21
打赏
举报
回复
我只是说会出现死锁的情况!!!!!!!!!没说你的操作会死锁,况且我也不知道你怎么做的!!
NewUser2008
2012-05-18
打赏
举报
回复
多线程 处理数据,独线程操作数据库,这样很好,以后维护也方便!
janeone
2012-05-18
打赏
举报
回复
[Quote=引用 11 楼 的回复:]
数据库本来就是支持多线程,高并发的。你只是插入,读 应该不会死锁
[/Quote]
我也是这么觉得……
但是log里面写timeout了,而且event log里面说是CLR20r3出错……我能够想到最大的可能性就是死锁了……
难道是数据库坏掉了?啊哈哈……不会吧=。=
janeone
2012-05-18
打赏
举报
回复
[Quote=引用 10 楼 的回复:]
将需要处理的数据放入队列 单独定义一个线程操作数据库
不要定义多个线程同时操作数据库
[/Quote]
你说的这种办法的确是一个很好的解决问题的办法呢,这样就不会有死锁的危险了……
但是我现在还没有确定是不是因为这个问题,就是不知道是不是真的是死锁了……我感觉程序这么写应该不会死锁,所以最好有人能够分析一下,我这么写程序会不会引起死锁,如果死锁的话,是什么样的情况……
baiwenyu
2012-05-18
打赏
举报
回复
数据库本来就是支持多线程,高并发的。你只是插入,读 应该不会死锁
请叫我卷福
2012-05-18
打赏
举报
回复
将需要处理的数据放入队列 单独定义
一个线程
操作数据库
不要定义多个线程同时操作数据库
janeone
2012-05-18
打赏
举报
回复
[Quote=引用 8 楼 的回复:]
ReadCommitted是许多数据库的缺省级别,这个隔离级别上,不会出现读取未提交的数据问题,但仍然无法避免不可重复读(包括幻影读)的问题。当你的系统对并发控制的要求非常严格时,这种默认的隔离级别可能无法提供数据有效的保护,但对于决大多数应用来讲,这种隔离级别就够用了。
也就是说很可能会出现死锁。
http://www.cnblogs.com/zhenyulu/articles/33……
[/Quote]
这个意思和死锁有关系么?我不是很清楚。
而且我的前提是我只是插入一条数据,又没有要求查询数据,脏读幻读之类的对于我没有影响吧?
蔡袅
2012-05-18
打赏
举报
回复
ReadCommitted是许多数据库的缺省级别,这个隔离级别上,不会出现读取未提交的数据问题,但仍然无法避免不可重复读(包括幻影读)的问题。当你的系统对并发控制的要求非常严格时,这种默认的隔离级别可能无法提供数据有效的保护,但对于决大多数应用来讲,这种隔离级别就够用了。
也就是说很可能会出现死锁。
http://www.cnblogs.com/zhenyulu/articles/330494.html
janeone
2012-05-17
打赏
举报
回复
[Quote=引用 4 楼 的回复:]
可能会发生
[/Quote]
能不能详细分析一下产生的原因和条件呢?……
janeone
2012-05-17
打赏
举报
回复
[Quote=引用 5 楼 的回复:]
引用 4 楼 的回复:
可能会发生
某些情况下一定会发生
[/Quote]
为什么这么说?话说是哪些情况下啊?
不是说 只要不涉及对于表的选择的话就不会产生死锁了么?
NewUser2008
2012-05-17
打赏
举报
回复
[Quote=引用 4 楼 的回复:]
可能会发生
[/Quote]
某些情况下一定会发生
anzhiqiang_touzi
2012-05-17
打赏
举报
回复
可能会发生
janeone
2012-05-17
打赏
举报
回复
偶 忘了说了……线程的定义里面当然还有 当操作结束后关闭事务以及关闭连接的操作……
我听说 如果是对数据库插入的话 不会产生死锁的 所以这样写……
但是运行下来 有很小的可能性会产生CLR20r3的错,难道是死锁了?……(仅出现过一次)
山之魂2
2012-05-17
打赏
举报
回复
我猜不会
检测线程
死锁
,告诉你如何检测线程
死锁
检测线程
死锁
,告诉你如何检测线程
死锁
,学习一下吧
C#
C#
多线程
实例6个(包括
多线程
基本使用,
多线程
互斥等全部
多线程
使用实例)
C#
C#
多线程
实例6个(包括
多线程
基本使用,
多线程
互斥等全部
多线程
使用实例)
C#
多线程
编程实战Code源代码
C#
多线程
编程实战Code源代码 资源是从华章出版社官网下载的
C#
多线程
系列讲座(同步,
死锁
等知识)
讲述
C#
开发过程中,怎么用
多线程
,需要注意的地方,比如
死锁
,同步,异步等知识。非本人原著,特别说明。
dump线程让
死锁
无处可逃
NULL 博文链接:https://caoyaojun1988-163-com.iteye.com/blog/1697395
C#
111,126
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章