悲观锁可以使用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查询则不受影响 。
执行事务时关键字select…for update会锁定数据,防止其他事务更改数据 。但是锁定数据也是有规则的 。
查询条件与锁定范围:
1、具体的主键值为查询条件
比如查询条件为主键ID=1等等,如果此条数据存在 , 则锁定当前行数据,如果不存在,则不锁定 。
2、不具体的主键值为查询条件
比如查询条件为主键ID1等等 , 此时会锁定整张数据表 。
3、查询条件中无主键
【mysql悲观锁怎么设置 医用腿部按摩器气囊】会锁定整张数据表 。
4、如果查询条件中使用了索引为查询条件
明确指定索引并且查到,则锁定整条数据 。如果找不到指定索引数据,则不加锁 。
悲观锁的确保了数据的安全性 , 在数据被操作的时候锁定数据不被访问,但是这样会带来很大的性能问题 。因此悲观锁在实际开发中使用是相对比较少的 。
mysql的乐观锁:
相对悲观锁而言 , 乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会对数据的冲突与否进行检测,如果发现冲突,则让返回用户错误的信息,让用户决定如何去做 。
一般来说,实现乐观锁的方法是在数据表中增加一个version字段 , 每当数据更新的时候这个字段执行加1操作 。这样当数据更改的时候 , 另外一个事务访问此条数据进行更改的话就会操作失败,从而避免了并发操作错误 。当然 , 还可以将version字段改为时间戳 , 不过原理都是一样的 。
例如有表student , 字段:
id,name,version
1a1
当事务一进行更新操作:update student set name='ygz' where id = #{id} and version = #{version};
此时操作完后数据会变为id = 1,name = ygz,version = 2,当另外一个事务二同样执行更新操作的时候 , 却发现version != 1 , 此时事务二就会操作失败,从而保证了数据的正确性 。
悲观锁和乐观锁都是要根据具体业务来选择使用,本文仅作简单介绍 。
关于mysql悲观锁怎么设置和医用腿部按摩器气囊的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- 美国Att卡显示无服务器,美国att电话卡在中国怎么用不了
- 大企业用的erp系统,一般企业erp用什么软件有哪些内容
- 如何为自己餐厅做广告营销,怎么为自己的餐饮宣传
- go语言现在好吗 go语言现在发展怎么样
- gis生态服务是什么意思,gis在生态领域的应用
- 飞碟在飞行的游戏,飞碟在飞行的游戏叫什么
- 单机游戏坐骑,好玩的坐骑游戏
- go语言IP地址转换 go语言配置
- 硬盘拆了怎么恢复数据,硬盘拆了是不是安全了