C#多线程死锁的问题

janeone 2012-05-17 05:01:40
程序中 线程定义是这样的:开一个数据库连接,然后开启事务,事务的隔离级别设定为IsolationLevel.ReadCommitted,操作一张表,即向表中插入一条数据

然后线程池的大小定义为4,也就是同时能有4个线程一起跑

这样的定义下,会不会产生资源争夺 以及死锁的可能呢……
...全文
615 17 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
我猜不会

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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