1、失望锁(Pessimistic Lock), 望文生义,便是很失望,每次去拿数据的时分都以为他人会修正,所以每次在拿数据的时分都会上锁,这样他人想拿这个数据就会block直到它拿到锁。传统的联系型数据库里面就用到了许多这种锁机制,比方行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
最常用的便是 select … for update,它是一种行锁,会把select出来的成果行锁住,在本业务提交或者回滚之前,不允许其他业务对这些行做update、delete、for update操作。
2、达观锁(Optimistic Lock), 望文生义,便是很达观,每次去拿数据的时分都以为他人不会修正,所以不会上锁,期间该数据能够随意被其他人读取,但是在更新的时分会判别一下在此期间他人有没有去更新这个数据,能够运用版本号等机制。
版本号机制是达观锁最常用的方法,便是在表中添加一个版本号的字段,更新前先查一遍获取版本号,再作为更新句子的where条件进行更新,假如数据在获取版本号之后,在更新之前现已改变了,那就会更新失利,由于最终更新了0条数据,java后台拿到更新数假如为0,则阐明更新失利,呈现了并发问题,然后做详细的处理。
例如有两个人一起对某条数据做修正,进程如下:
操作员A操作如下:
select id, balance, version from table where id=“1”;
查询成果:id=1, balance=1000, version=1
update table set balance=balance+100, version=version+1 where id=“1” and version=1;
履行后,回来的更新成果是1,阐明更新了一条,数据库里的成果是:id=1, balance=1100, version=2
A8站源码交易平台 操作员B操作如下:
select id, balance, version from table where id=“1”;
查询成果:id=1, balance=1000, version=1, 阐明操作员A还没修正。
update table set balance=balance-50, version=version+1 where id=“1” and version=1 ;
查的时分,操作员A还没修正,当要更新时,操作员A现已先修正成功,所以数据库里实践值是id=1, balance=1100, version=2,
操作员B也将版本号加一(version=2)企图向数据库提交数据(balance=950),但此刻查不到where id=“1” and version=1 的数据,
所以update就失利了,履行成果是0,阐明没有对任何数据更新成功。
现在再去查一下,成果仍是操作员A操作完结之后的成果
select id, balance, version from table where id=“1”;
查询成果:id=1, balance=1100, version=2
以上是自己完成版本号机制的原理,真实运用的版本号机制是数据库自身带有的机制,一旦发现更新的版本号不是最新的就会被驳回。
---------------------
版权声明:本文为 A8站源码交易平台 原创