悲观锁:固执地认为我操作这条数据的同时这条数据一定会被别人修改,所以我操作这条数据时先把数据锁定起来,不让别人修改。使用事务进行,select……for update锁定这条数据。
注:锁定时如果指定了主键,会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住)。
注:要使用悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。
注:需要注意的是,在事务中,只有SELECT … FOR UPDATE 或LOCK IN SHARE MODE 同一笔数据时会等待其它事务结束后才执行,一般SELECT … 则不受此影响。
乐观锁:并不认为我操作这条数据时别人也会操作,所以我们先给这条数据加一个版本号(可以为一个updatetime字段),查询当前数据的updatetime,去更新当前的updatetime所在的这一条数据,如果没有更新成功,则重新执行。