锁粒度的控制

update数据库的时候,数据库控制并发的方式,基本分为2种:乐观锁、悲观锁。

悲观锁

锁记录我们一般的操作就是SELECT … FOR UPDATE,行级锁。这个SQL在读取完数据后,就能把这行数据锁住,防止其它SESSION对行数据进行修改。这就是我们所说的悲观锁。
为什么叫悲观锁呢,因为它会让其它SESSION阻塞,等待锁定行记录的那条SESSION将修改COMMIT掉后才能获得对行数据的操作资源。
我们通常不提倡用悲观锁,为什么呢?因为我们通常公司里的服务都是访问量挺高的,所以占用数据池资源是挺大的,如果用悲观锁,就会导致很多的资源阻塞而无法使用,这样我们的系统便会变得很慢,老是在等资源。
个人觉得悲观锁的使用场景得看业务和实际情况,如果这个模块本身访问量就很低,那就可以用悲观锁。

乐观锁

在表中加入版本号字段,更新时将版本号同时更新。
在表中加入字段,每次UPDATE前会先去读取该版本号(可以是一个整数),更新的时候将之前读取版本号加1再和实际那行的版本号比较,如果大于实际版本号便更新,其他则失败。
举个例子,比如表中的字段LOCK_ST = 0。2个SEESION同时去更新它,a SESSION和b SESSION同时会读取0这个值,然后a比较快,更新了这条数据,并把版本字段LOCK_ST更新成1,这个时候b再去更新,b会把读到的LOCK_ST加1,
也就是0+1,然后提交更新的时候比较版本号,发现1=1,所以更新不了,于是b就失败了。这就是我们所说的乐观锁。不锁定资源,任由所有SESSION都去更新,但是更新会失败。
通常我们的系统中比较提倡乐观锁,原因和悲观锁正好相反。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×