参考
http://www.cnblogs.com/Bob-FD/p/3352216.html
为什么需要锁(并发控制),为了防止冲突。
最常用的处理多用户并发访问的方法是加锁。当一个用户锁住数据库中的某个对象时,其他用户就不能再访问该对象。加锁对并发访问的影响体现在锁的粒度上。比如,放在一个表上的锁限制对整个表的并发访问;放在数据页上的锁限制了对整个数据页的访问;放在行上的锁只限制对该行的并发访问。可见行锁粒度最小,并发访问最好,页锁粒度最大,表锁介于2者之间。
悲观锁假设冲突率相当高,屏蔽一切可能违反数据完整性的操作。开始改变对象之前就将对象锁住,提交了所有的更改之后才释放锁。缺陷是加锁时间很长,并发访问性不好。
而乐观锁假设冲突不是很高,只在提交操作时检查是否违反数据完整性。直到准备提交所做的更改时才将对象锁住,读取以及改变对象时并不加锁。乐观锁可以获得较好的并发访问性能。乐观锁并不能解决脏读。
乐观锁读的时候有一个版本号,如果写的时候版本号与读取的版本号不一致,表示已经被人修改过。也可以使用时间戳来实现。
在实际生产环境里边,如果并发量不大且不允许脏读,可以使用悲观锁解决并发问题;但如果系统的并发非常大的话,悲观锁定会带来非常大的性能问题,所以我们就要选择乐观锁定的方法.