数据库两大必备神器:索引和锁底层原理是什么!
表锁下又分为两种模式:
从上面已经看到了:读锁和写锁是互斥的,读写操作是串行。
值得注意的是:
3、乐观锁和悲观锁 无论是Read committed还是Repeatable read隔离级别,都是为了解决读写冲突的问题。 单纯在Repeatable read隔离级别下我们来考虑一个问题: 此时,用户李四的操作就丢失掉了:
(ps:暂时没有想到比较好的例子来说明更新丢失的问题,虽然上面的例子也是更新丢失,但一定程度上是可接受的..不知道有没有人能想到不可接受的更新丢失例子呢...) 解决的方法:
3.1、悲观锁 所以,按照上面的例子。我们使用悲观锁的话其实很简单(手动加行锁就行了):
在select 语句后边加了 for update相当于加了排它锁(写锁),加了写锁以后,其他的事务就不能对它修改了!需要等待当前事务修改完之后才可以修改.
3.2、乐观锁 乐观锁不是数据库层面上的锁,是需要自己手动去加的锁。一般我们添加一个版本字段来实现: 具体过程是这样的: 张三select * from table --->会查询出记录出来,同时会有一个version字段 李四select * from table --->会查询出记录出来,同时会有一个version字段 李四对这条记录做修改:update A set Name=lisi,version=version+1 where ID=#{id} and version=#{version},判断之前查询到的version与现在的数据的version进行比较,同时会更新version字段 此时数据库记录如下: (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |