在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。 sql
典型的冲突有: 数据库
为了解决这些并发带来的问题。 咱们须要引入并发控制机制。 并发
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操做。[1] 性能
乐观锁:假设不会发生并发冲突,只在提交操做时检查是否违反数据完整性。[1] 乐观锁不能解决脏读的问题。 spa
注:对于以上两种方式,Hibernate自带实现方式:在使用乐观锁的字段前加annotation: @Version , Hibernate在更新时自动校验该字段。 .net
注:对于以上两种方式,Hibernate自带实现方式:在使用乐观锁的字段前加annotation: @Version , Hibernate在更新时自动校验该字段。 code
须要使用数据库的锁机制,好比SQL SERVER 的TABLOCKX(排它表锁) 此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其余进程读取或修改表中的数据。 进程
SqlServer中使用 事务
Begin Tran select top 1 @TrainNo=T_NO from Train_ticket with (UPDLOCK) where S_Flag=0 update Train_ticket set T_Name=user, T_Time=getdate(), S_Flag=1 where T_NO=@TrainNo commi
咱们在查询的时候使用了with (UPDLOCK)选项,在查询记录的时候咱们就对记录加上了更新锁,表示咱们即将对此记录进行更新. 注意更新锁和共享锁是不冲突的,也就是其余用户还能够查询此表的内容,可是和更新锁和排它锁是冲突的.因此其余的更新用户就会阻塞. ip
在实际生产环境里边,若是并发量不大且不容许脏读,能够使用悲观锁解决并发问题;但若是系统的并发很是大的话,悲观锁定会带来很是大的性能问题,因此咱们就要选择乐观锁定的方法.
[1]Concurrent Control http://en.wikipedia.org/wiki/Concurrency_control
[2] Oracle的悲观锁和乐观锁http://space.itpub.net/12158104/viewspace-374745