多用户下的死锁

多用户下的死锁

概念:
  在多个用户同时操作一条数据的时候,如果前面一个用户更新了数据,但是没有提交事务,
  则后面一个用户不能操作当前数据,只有等待上一个用户提交事务之后才能进行操作.

悲观锁:
  在数据库中如果某个用户在更新一条数据的时候会取得一把锁,锁住正在更新的数据,
  这个锁是当前用户占有的,在当前用户操作该数据的过程中,其他用户不能操作该数据,在操作完成之后会释放锁(为该条数据释放锁)
  释放锁之后其他用户才能进行操作,这是一种悲观锁 (认为数据一定会出现安全问题,所以就要锁定), 也是独占锁 (与共享锁是相对的),
  那么在什么情况下任务数据操作完毕了呢?两种情况: 提交事务, 事务回滚

乐观锁:
  其实上数据库提供的锁机制是一种悲观锁,此外有乐观锁,乐观锁是通过控制版本号或者时间来实现的一种锁机制,要结合程序才能实现

如何要让查询语句出现死锁现象:
  我们可以在查询语句之后增加一个关键字: "FOR UPDATE"

ex:
  SELECT * FROM myemp WHERE empno=7369 FOR UPDATE;

悲观锁与乐观锁的区别:
  悲观锁:
    认为数据库更新时一定会发生出冲突,因此需要对记录加锁,以保证数据的一致性.
    因其为行级锁,具有较好的性能,通常针对并发使用.
  乐观锁:
    认为数据库不存在冲突,因此,需要再提交时保证数据一致性,如果不一致,则返回错误,
    由程序本身的逻辑进行处理

乐观锁的实现主要有三种方式:
  1.通过比较提交前后的数据是否发生变化来判断是否存在数据冲突
  2.通过在表中增加版本序列,来标示是否发生了变化
  3.通过比对表的时间来判断是否出现了版本变化
  可以通过trigger 或存储过程实现该乐观锁

猜你喜欢

转载自www.cnblogs.com/yslf/p/11289534.html
今日推荐