为什么需要锁(并发控制)? 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。 典型的冲突有: l 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。 ...
分类:
其他好文 时间:
2015-07-09 13:01:59
阅读次数:
89
乐观锁思路 这个时候,我们就可以讨论一下“乐观锁”的思路了。乐观锁,是相对于“悲观锁”采用更为宽松的加锁机制,大都是采用带版本号(Version)更新。实现就是,这个数据所有请求都有资格去修改,但会获得一个该数据的版本号,只有版本号符合的才能更新成功,其他的返回抢购失败。这样的话,我们就不需要考虑....
分类:
其他好文 时间:
2015-07-07 19:23:32
阅读次数:
135
锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数据再发生变化。此时,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外....
分类:
其他好文 时间:
2015-07-07 12:54:47
阅读次数:
103
悲观锁:悲观锁悲观的认为每一次操作都会造成更新丢失问题,在每次查询时就加上排他锁
乐观锁:乐观锁会乐观的认为每次查询都不会造成更新丢失.利用一个版本字段进行控制
查询非常多,修改非常少,使用乐观锁
修改非常多,查询非常少,使用悲观锁
第一张图的解释:
小zhang想在一个游戏网站买装备,此时游戏网站会去重定向到银行(假设是建设银行),然后银行再重定向会这个游戏网站.
但...
分类:
其他好文 时间:
2015-07-01 10:15:12
阅读次数:
91
在做数据库访问的时候,遇到了这样的问题:两个线程同时访问同一对象中的方法,那么就可能会引发数据不一致的问题,那么我们需要做的,就是加上锁。
Synchronized
Java中用来给对象和方法或者代码加锁的,当他锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行该代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只有一个线程得到,另一...
分类:
编程语言 时间:
2015-06-30 00:10:07
阅读次数:
311
这是我的ERP设计经验分享系列,今天讲的是数据库的表设计(1),主要阐述:1、单字段的主键;2、使用int32作为主键类型;3、使用版本字段处理乐观锁定;4、生效字段标明是否允许“被使用”;5、锁定字段处理悲观锁定;6、行唯一字段处理分布式应用;
分类:
数据库 时间:
2015-06-27 22:35:56
阅读次数:
221
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人...
分类:
其他好文 时间:
2015-06-19 20:22:15
阅读次数:
139
业务逻辑的实现过程中,往往需要保证数据访问的排他性。因此,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的“锁”,即给我们选定的目标数据上锁,使其无法被其它程序修改。Hibernate 支持两种锁机制:1. 悲观锁(Pessimistic Lock...
分类:
Web程序 时间:
2015-06-17 23:04:24
阅读次数:
1214
乐观锁 悲观锁 CAS java AtomicInteger concurrent...
分类:
其他好文 时间:
2015-06-14 12:34:28
阅读次数:
10519
这里仅仅是验证多线程环境下,AtomicInteger的安全性。通过源码不难发现两点:1、value属性是volatile修饰2、使用了unsafe的CAS操作通过上述两点,实现非阻塞同步(乐观锁),实现线程安全。/** * 验证在并发情况下,AtomicInteger的线程安全性 * Atomic...
分类:
其他好文 时间:
2015-06-12 19:21:11
阅读次数:
145