关于锁的讨论

一、背景:并发问题一直是企业架构不能忽视的问题,也就是说不可以高枕无忧,始终有些地方你是忽略掉的,对同一片数据库,不同线程同时访问就会出现并发,并发业务性并发和数据库并发,事务系统的出现就是为了解决这种并发问题,事务也是利用锁的原理,锁定后只允许一个请求获得资源,当然事务中的锁要视事务隔离性而定,现在我们来讨论下关于锁和事务;

二、锁分为悲观锁和乐观锁,悲观锁是在一个请求获得资源并且释放锁后另一个请求才能获得资源,乐观锁是一个请求获得资源,但允许另一个请求也获得资源,但是第一个请求修改并提交资源时,另一个请求修改并提交的时候会提交不成功,这里可以有合并操作的处理,例如svn代码的版本控制,也可以另一个提交失败;

三、.net环境中的锁,基元线程同步构造包含用户模式构造和内核模式构造,基元就是可以在代码中使用的最简单的构造,用户模式构造提供易变构造,它在包含一个简单变量上执行原子性读和写操作,例如system.Threading.Volatie类提供的Volatie.write\Volatie.read方法,或者在字段标记关键字Volatie;互锁构造,和易变构造定义一样,都是对简单数据类型变量上执行原子性操作,system.Threading.InterLocked建立完整内存栅栏,也就是说调用InterLocked方法之前任何变量写入都在调用InterLocked方法之前写入,这个调用之后的任何变量读取都在这个调用之后读取,后一句可能大家不能理解,这里解析下,就是说C#编译器将代码转换成中间语言IL,JIT编译器将其转换成CPU的时候,可能将两个变量赋值的顺序反转,这个时候,编译代码的时候现将变量从RAM读入CPU寄存器,这个时候可能先读入一个变量,同时另一线程将这个变量赋值,而你不知情;内核模式构造和混合模式(lock)锁另外章节讨论;

四、分布式锁,分布式锁将访问的资源锁定,同一时间只有一个用户可以访问这类资源,例如时下的摇一摇,对整个业务同一时刻只允许一次访问,于是利用redis、memcached的原子性操作,将整个业务对同一个用户进行锁定,处理完之后再允许下一次操作,分布式锁不能使用数据库的原子性操作,只能是redis、memcached、zookeeper这种外部资源;

1、首先memcached提供过的函数set,在多线程访问时,set函数都会成功,但是会以最后一个线程set为准,而add函数则相反第一个线程add函数会成功返回true,其他线程set都会返回false,利用memcached比较高效,但如果memcached内存不够就会丢失锁,导致死锁,又因为memcache没有持久化,因此宕机重启后锁丢失;

2、zookeeper,基于zookeeper瞬时有序节点,当加锁时与该功能对应的指定节点的目录下,生成一个唯一的瞬时有序节点,当释放锁的时候,只需将这个瞬时节点删除即可,因为可以持久化,所以防止宕机时重启时,丢失锁信息;

3、redis原子性操作,与memcached一样利用add函数的原子性操作也可以实现分布式锁;

五、数据库中的事务,数据库中的锁其他章节讨论,数据库或软件事务都使用ACID属性来描述,分别是原子性,即一系列动作步骤,要么全部成功,要么全部失败;一致性,事务开始到结束,系统资源必须一致,如果中途出现故障,一部分写入是无效的,中间状态没有遭到破坏;隔离性,一个事务中的数据和操作相对与其他事务具有隔离性,并发事务之间并不干扰;持久性,一旦提交成功,提交后的数据将永久存在,即使系统崩溃也能持久保存下来;如果系统总是使用全完隔离的事务,将会降低系统吞吐率,为了提供系统灵活性,事务可以减少隔离性,事务的隔离性一般分为4个种类,如下介绍:

1、可串行化事务(serializable),可串化事务是隔离级别最高的一种,使用可串化级别事务可以避免脏读、幻读、不可重复读,使用此种事务,各个事务之间相互隔离,会以某种顺序执行这些事务,但系统吞吐率受到影响;

2、可重复度(repeatable read),就是说A事务读取了数据a,那么B事务就不能对a数据进行修改,必须等待A事务提交,你可能会说和串行化事务有什么区别,区别就是串行化会锁定资源的表,你不可以插入数据造成幻读;

3、不可重复度或者读已提交(read committed),A用户读取了a数据,B用户对a进行操作,这时候A要等B修改完提交事务才能修改a数据;

4、读未提交(read uncommitted),这种事务隔离级别最低,就是说A对a数据进行修改的时候,B可以读取到A修改但未提交的数据,A可能回滚了,但B读的是脏读数据;和不可重复读区别在于不可重复读,是读取的时提交后的数据;

其他锁在后续完善

posted @ 2017-03-19 22:24  维生素ABC  阅读(118)  评论(0编辑  收藏  举报
好好学习哈!