sql server对并发的处理-乐观锁和悲观锁
2017-10-13 15:14
148 查看
假如两个线程同时修改数据库同一条记录,就会导致后一条记录覆盖前一条,从而引发一些问题。
例如:
一个售票系统有一个余票数,客户端每调用一次出票方法,余票数就减一。
情景:
总共300张票,假设两个售票点,恰好在同一时间出票,它们做的操作都是先查询余票数,然后减一。
一般的sql语句:
问题就在于,同一时间获取的余票都为300,每个售票点都做了一次更新为299的操作,导致余票少了1,而实际出了两张票。
打开两个查询窗口,分别快速运行以上代码即可看到效果。
定义解释:
悲观锁:相信并发是绝大部分的,并且每一个线程都必须要达到目的的。
乐观锁:相信并发是极少数的,假设运气不好遇到了,就放弃并返回信息告诉它再次尝试。因为它是极少数发生的。
悲观锁解决方案:
在查询的时候加了一个更新锁,保证自查询起直到事务结束不会被其他事务读取修改,避免产生脏数据。
从而可以解决上述问题。
乐观锁解决方案:
这便是乐观锁的解决方案,可以解决并发带来的数据错误问题,但不保证每一次调用更新都成功,可能会返回'更新失败'
悲观锁和乐观锁
悲观锁一定成功,但在并发量特别大的时候会造成很长堵塞甚至超时,仅适合小并发的情况。
乐观锁不一定每次都修改成功,但能充分利用系统的并发处理机制,在大并发量的时候效率要高很多。
例如:
一个售票系统有一个余票数,客户端每调用一次出票方法,余票数就减一。
情景:
总共300张票,假设两个售票点,恰好在同一时间出票,它们做的操作都是先查询余票数,然后减一。
一般的sql语句:
问题就在于,同一时间获取的余票都为300,每个售票点都做了一次更新为299的操作,导致余票少了1,而实际出了两张票。
打开两个查询窗口,分别快速运行以上代码即可看到效果。
定义解释:
悲观锁:相信并发是绝大部分的,并且每一个线程都必须要达到目的的。
乐观锁:相信并发是极少数的,假设运气不好遇到了,就放弃并返回信息告诉它再次尝试。因为它是极少数发生的。
悲观锁解决方案:
在查询的时候加了一个更新锁,保证自查询起直到事务结束不会被其他事务读取修改,避免产生脏数据。
从而可以解决上述问题。
乐观锁解决方案:
悲观锁和乐观锁
悲观锁一定成功,但在并发量特别大的时候会造成很长堵塞甚至超时,仅适合小并发的情况。
乐观锁不一定每次都修改成功,但能充分利用系统的并发处理机制,在大并发量的时候效率要高很多。
相关文章推荐
- sql server对并发的处理-乐观锁和悲观锁
- 乐观锁与悲观锁的应用场景----处理高并发数据
- sql server对并发的处理-乐观锁和悲观锁
- Hibernate事务与并发问题处理(乐观锁与悲观锁)
- Hibernate事务与并发问题处理(乐观锁与悲观锁)
- HIbernate学习笔记(九) hibernate事务并发处理与乐观悲观锁
- Hibernate事务与并发问题处理(乐观锁与悲观锁)
- Java乐观锁悲观锁、synchronized,重入锁 (ReentrantLock)处理并发(互斥同步、非互斥同步)
- Hibernate事务、隔离级别、与并发问题处理(乐观锁与悲观锁)
- sql server对并发的处理-乐观锁和悲观锁
- Hibernate事务与并发问题处理(乐观锁与悲观锁)
- Hibernate事务与并发问题处理(乐观锁与悲观锁)
- [Hibernate] Hibernate事务与并发问题处理(乐观锁与悲观锁)
- Hibernate事务与并发问题处理(乐观锁与悲观锁)
- 乐观锁与悲观锁处理并发
- Hibernate事务与并发问题处理(乐观锁与悲观锁)
- Hibernate事务与并发问题处理(乐观锁与悲观锁)
- Hibernate事务并发问题处理(乐观锁与悲观锁)
- sql server对并发的处理-乐观锁和悲观锁
- sql server对并发的处理-乐观锁和悲观锁