多用户下的死锁
概念:
在多个用户同时操作一条数据的时候,如果前面一个用户更新了数据,但是没有提交事务,
则后面一个用户不能操作当前数据,只有等待上一个用户提交事务之后才能进行操作.
悲观锁:
在数据库中如果某个用户在更新一条数据的时候会取得一把锁,锁住正在更新的数据,
这个锁是当前用户占有的,在当前用户操作该数据的过程中,其他用户不能操作该数据,在操作完成之后会释放锁(为该条数据释放锁)
释放锁之后其他用户才能进行操作,这是一种悲观锁 (认为数据一定会出现安全问题,所以就要锁定), 也是独占锁 (与共享锁是相对的),
那么在什么情况下任务数据操作完毕了呢?两种情况: 提交事务, 事务回滚
乐观锁:
其实上数据库提供的锁机制是一种悲观锁,此外有乐观锁,乐观锁是通过控制版本号或者时间来实现的一种锁机制,要结合程序才能实现
如何要让查询语句出现死锁现象:
我们可以在查询语句之后增加一个关键字: "FOR UPDATE"
ex:
SELECT * FROM myemp WHERE empno=7369 FOR UPDATE;
悲观锁与乐观锁的区别:
悲观锁:
认为数据库更新时一定会发生出冲突,因此需要对记录加锁,以保证数据的一致性.
因其为行级锁,具有较好的性能,通常针对并发使用.
乐观锁:
认为数据库不存在冲突,因此,需要再提交时保证数据一致性,如果不一致,则返回错误,
由程序本身的逻辑进行处理
乐观锁的实现主要有三种方式:
1.通过比较提交前后的数据是否发生变化来判断是否存在数据冲突
2.通过在表中增加版本序列,来标示是否发生了变化
3.通过比对表的时间来判断是否出现了版本变化
可以通过trigger 或存储过程实现该乐观锁