求问大牛们C#并发处理的问题

ccmaojiushiwo 2013-08-14 09:40:20

看了下并发处理的讨论,看到了以下内容

引用
1.数据库级别的并发:这发生在多个系统事务在同一时间试图操作同样的数据的
时候,此时往往通过事务的隔离级别来解决.隔离级别过小会使数据不安全,而隔离级别过大又会降低数据库性能.因此大部分数据库将隔离级别设置成Read Committed,意思就是说一个事务在执行过程中可以得到其他事务已经提交的更新(注意是更新而不是插入). 而此时为了在一个事务内的多次查询中获得同样的数据,我们往往还需要将这多个查询放在一个只读事务里.
2.代码级别的并发:这发生在某个类中具有不安全因素(例如具有多个线程都可以修改的类变量),而这个类又处在多线程访问的模式下. 此时我们往往通过具体语言提供的同步机制来解决,在安全的同时也降低了性能,因为一个线程在访问时其他线程必须等待.
3.应用程序级别的并发: 这发生在多个业务事务同一时间操作同样的数据的时候,这会带来丢失更新和不一致读,在对数据的实时性要求不是很高的系统中,不一致读往往不是问题,用户也不会觉得不合理. 而在用户操作数据时发生丢失更新往往不能忍耐. 此时我们的解决方案是应用程序级别的锁定. 一种是乐观锁,通过给记录加版本号,在操作提交时如果发现在操作期间其他人修改过该条记录,则提示用户更新失败. 这适合在并发机率很低的情况使用,因为用户很可能填了一堆东西你却告诉他失败需要重填,他会发疯. 另一种是悲观锁,通过严格限制来避免冲突. 悲观锁分为写锁和读锁,写锁很简单,一个人在操作一条记录的时候其他人只能读该记录,而不能操作. 而读锁很严格,它又分为共享读锁和独占读锁,共享读锁指一个人只要在读该记录的时候,其他人就也只能读不能操作.而独占读锁是所有锁中最严格的,他实现只要一个在正在读该记录,其他人就不能读,这是为了保证用户获得的一定是最新记录,它假定其他人只要在读一条记录,就可能会修改它. 因为悲观锁需要在操作期间不断的加锁解锁,会严重影响性能,并且实现起来很麻烦,所以尽量少使用.




第一条数据库级别的并发

在数据库里写事务比如
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
update table1 set A='aa' where B='b2'
waitfor delay '00:00:05' --等待5秒
commit tran

如果在程序里写
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = connection.CreateCommand();
SqlTransaction transaction;
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted,"SampleTransaction");
command.Connection = connection;
command.Transaction = transaction;
try
{
command.CommandText ="update table1 set A='aa' where B='b2'";
command.ExecuteNonQuery();
Thread.Sleep(5000);
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
}
}
第一个问题,求问大牛们数据库写事务好还是程序里写事务好?

第二条代码级别的并发
可以在程序加锁用ReaderWriterLockSlim类做到的样子或者用Application.Lock();Application.UnLock();或者直接Lock(this.xx)
第二个问题,求问大牛们你们是用什么锁定的?


第三条应用程序级别的并发
乐观锁可以用时间戳或者设置个版本号,更新的时候比对一下一开始获取时候的值,如果一样的话就更新,否则就提示别人“已经修改过,更新失败”

悲观锁的话也是指事务隔离级别或数据库锁吧。
事务隔离级别
SET TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SNAPSHOT
| SERIALIZABLE
}
[ ; ]
数据库锁例如SELECT * FROM table WITH (HOLDLOCK) --其他事务只能读取表,但不能更新删除
第三个问题,不知道我理解的悲观锁和乐观锁对不对?
最后个问题大牛们是如何进行并发处理的?

分数不多,全部家当了,求大牛们赐教!

...全文
132 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
全栈极简 2013-08-14
  • 打赏
  • 举报
回复
其实你说的两个问题。一个是事务,一个是锁。 第一个问题,在代码里写的事务最终还是会转化为数据库中的事务来处理,因此不存在谁好谁坏的问题,根据你的需要。 第二个问题,乐观锁和悲观锁,你引用部分说的很明白,这里不重复。我一般在程序中都是用lock关键字进行锁定。比如:http://blog.csdn.net/chinacsharper/article/details/9117851 既然提到了锁,还有死锁、活锁,互斥锁、共享锁等等这些概念,任何一本数据库原理的书上都有的。

110,534

社区成员

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

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

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