mysql中的乐观锁和悲观锁

mysql中的乐观锁悲观锁的简介以及如何简单运用。mysql

  1. 关于mysql中的乐观锁和悲观锁面试的时候被问到的几率仍是比较大的。面试

    mysql的悲观锁:sql

          其实理解起来很是简单,当数据被外界修改持保守态度,包括自身系统当前的其余事务,以及来自外部系统的事务处理,所以,在整个数据处理过程当中,将数据处于锁定状态。悲观锁的实现,每每依靠数据库提供的锁机制,可是也只有数据库层提供的锁机制才能真正保证数据访问的排他性,不然,即便在自身系统中实现了加锁机制,也没法保证外部系统不会修改数据。数据库

          来点实际的,当咱们使用悲观锁的时候咱们首先必须关闭mysql数据库的自动提交属性,由于MySQL默认使用autocommit模式,也就是说,当你执行一个更新操做后,MySQL会马上将结果进行提交。安全

  2. 关闭命令为:set autocommit=0;并发

    悲观锁可使用select…for update实现,在执行的时候会锁定数据,虽然会锁定数据,可是不影响其余事务的普通查询使用。此处说普通查询就是平时咱们用的:select * from table 语句。在咱们使用悲观锁的时候事务中的语句例如:性能

    //开始事务索引

    begin;/begin work;/start transaction; (三选一)事务

    //查询信息开发

    select * from order where id=1 for update;

    //修改信息

    update order set name='names';

    //提交事务

    commit;/commit work;(二选一)

    此处的查询语句for update关键字,在事务中只有SELECT ... FOR UPDATE 或LOCK IN SHARE MODE 同一条数据时会等待其它事务结束后才执行,通常的SELECT查询则不受影响。

  3. 执行事务时关键字select…for update会锁定数据,防止其余事务更改数据。可是锁定数据也是有规则的。

    查询条件与锁定范围:

    一、具体的主键值为查询条件

    好比查询条件为主键ID=1等等,若是此条数据存在,则锁定当前行数据,若是不存在,则不锁定。

    二、不具体的主键值为查询条件

    好比查询条件为主键ID>1等等,此时会锁定整张数据表。

    三、查询条件中无主键

    会锁定整张数据表。

    四、若是查询条件中使用了索引为查询条件

    明确指定索引而且查到,则锁定整条数据。若是找不到指定索引数据,则不加锁。

           悲观锁的确保了数据的安全性,在数据被操做的时候锁定数据不被访问,可是这样会带来很大的性能问题。所以悲观锁在实际开发中使用是相对比较少的。

  4. mysql的乐观锁:

          相对悲观锁而言,乐观锁假设数据通常状况下不会形成冲突,因此在数据进行提交更新的时候,才会对数据的冲突与否进行检测,若是发现冲突,则让返回用户错误的信息,让用户决定如何去作。

          通常来讲,实现乐观锁的方法是在数据表中增长一个version字段,每当数据更新的时候这个字段执行加1操做。这样当数据更改的时候,另一个事务访问此条数据进行更改的话就会操做失败,从而避免了并发操做错误。固然,还能够将version字段改成时间戳,不过原理都是同样的。

    例若有表student,字段:

    id,name,version

    1     a       1

    当事务一进行更新操做:update student set name='ygz' where id = #{id} and version = #{version};

    此时操做完后数据会变为id = 1,name = ygz,version = 2,当另一个事务二一样执行更新操做的时候,却发现version != 1,此时事务二就会操做失败,从而保证了数据的正确性。

          悲观锁和乐观锁都是要根据具体业务来选择使用,本文仅做简单介绍。

相关文章
相关标签/搜索