乐观锁和悲观锁如何实现(乐观锁和悲观锁)

导读 你们好,最近小活发现有诸多的小伙伴们对于乐观锁和悲观锁如何实现,乐观锁和悲观锁这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起

你们好,最近小活发现有诸多的小伙伴们对于乐观锁和悲观锁如何实现,乐观锁和悲观锁这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。

1、 关于mysql乐观锁和悲观锁面试被问到的概率还是比较大的。

2、 mysql的悲观锁:

3、 其实理解起来很简单。当数据被外界修改时,是保守的,包括自身系统的其他事务和外部系统的事务。因此,在整个数据处理过程中,数据是锁定的。悲观锁的实现,

4、 往往依赖于数据库提供的锁定机制,但只有数据库层提供的锁定机制才能真正保证数据访问的排他性,否则即使在自己的系统中实现了锁定机制,也不能保证外部系统不会修改数据。

5、 实际来说,我们在使用悲观锁的时候,首先要关闭mysql数据库的autocommit属性,因为MySQL默认使用自动提交模式,也就是在你执行一个更新操作之后,

6、 MySQL将立即提交结果。

7、 关闭命令是:设置自动提交=0;

8、 悲观锁定可以通过使用select…for update来实现,它会在执行时锁定数据。虽然会锁定数据,但不会影响其他事务的普通查询使用。

9、 //启动事务

10、 Start; /start work; /start trading; (choose one from three)

11、 //查询信息

12、 select * from order where id=1for update;

13、 //修改信息

14、 update order set name='names';

15、 //提交事务

16、 Submit; /Submit the work; (choose one from two)

17、 此处的查询语句为update关键字,当只选择.对于在共享模式下被更新或锁定的事务中的相同数据,将等到其他事务结束后再执行。

18、 普通的选择查询不受影响。

19、 执行事务时,关键字select…for update锁定数据,以防止其他事务块更改数据。但是锁定数据是有规则的。

20、 查询条件和锁定范围:

21、 1.特定的主键值就是查询条件。

22、 比如查询条件是主键ID=1等。如果这条数据存在,当前行数据将被锁定;如果它不存在,就不会被锁定。

23、 2.不特定的主键值是查询条件。

24、 例如,如果查询条件是主键ID1,则整个数据表将被锁定。

25、 3、查询条件中无主键

26、 会锁定整张数据表。

27、 4、如果查询条件中使用了索引为查询条件

28、 明确指定索引并且查到,则锁定整条数据。如果找不到指定索引数据,则不加锁。

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

30、 mysql的乐观锁:

31、 相对悲观锁而言,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会对数据的冲突与否进行检测,如果发现冲突,则让返回用户错误的信息,让用户决定如何去做。

32、 边愁 一般来说,实现乐观锁的方法是在数据表中增加一个version字段,每当数据更新的时候这个字段执行加1操作。这样当数据更改的时候,另外一个事务访问此条数据进行更改的话就会操作失败,

33、 从而避免了并发操作错误。当然,还可以将version字段改为时间戳,不过原理都是一样的。

34、 例如有表student,字霸施段:

35、 id,name,version

36、 1 a 1

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

38、 此时操作完后数据会变为id=1,name=ygz,version=2,当另外一个事务二同样执行更新操作的时候,却发现version !=1,此时事务二就会操作失败,

39、 从而保证了数据的正确性。

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

以上就是乐观锁和悲观锁这篇文章的一些介绍,希望对大家有所帮助。

标签:

免责声明:本文由用户上传,如有侵权请联系删除!