锁引发的问题

有次被问到怎么样写2个SQL事务避免死锁,这2个事务操作一些相同的表。

其实避免死锁是很困难的,理解死锁的原因,仔细想想如果2个事务访问公共表的顺序相同,那么这样就可以避免死锁,但是前提是这2个事务sql操作可以做到顺序相同。总体感觉这个问题不严谨。

 

其实关于减少SQL Server的死锁有这样一篇文章:http://www.cnblogs.com/zhuor/archive/2006/07/28/462263.html

数据库避免死锁主要有2种方法:(1)一次封锁法,(2)顺序封锁法。

参见:

http://www.cs.xmu.edu.cn/education/fine_courses/database/%BE%AB%C6%B7%BF%CE%B3%CC%BD%A8%C9%E8%C4%DA%C8%DD/3_%CD%F8%C2%E7%B0%E6cai/content/8/8.4.0.htm

 

数据库理论里关于锁的问题非常多,向多级封锁协议,两段封锁协议,多粒度锁等等,都是为了解决并发问题。

 

其实不只数据库里,操作系统里同样关注锁的问题,并提供了死锁避免多种方法:

(1).一次封锁法,操作系统里也叫资源静态分配法。

(2).还有一种的就是让进程只每次只能拥有一个资源,这个显然不切实际。

(3).资源编号,只能按编号递增申请资源。
(4).是著名的银行家算法

其实死锁主要分为死锁避免,死锁检测,死锁解除。

 

锁除了我们经常使用信号量,还有linux内核中使用的自旋锁也是一个很有意思的锁,http://162.105.203.49:8080/wdb/upload/forum21_f_2.doc

自旋锁可以在中断上下文中使用,与信号量还是有区别的:http://blog.chinaunix.net/u2/83703/showart_1359265.html

所谓中断上下文就是中断发生时的上下文,哈哈,具体可以参见《linux内核设计与实现》以及http://thns.tsinghua.edu.cn/thnsebooks/ebook204/10.pdf注意中断上下文中不能睡眠和i/o操作

linux内核同步主要使用屏蔽中断、原子变量、自旋锁、信号量、环形缓冲区等。

http://www.yuanma.org/data/2008/0913/article_3161.htm

总之锁是一个很有意思的问题。

           

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值