MySQL悲观锁

来源:互联网 发布:爱奇艺网络电影排行榜 编辑:程序博客网 时间:2024/06/10 04:26

MySQL悲观锁

一、概述

定义:

  • 对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,在数据处理过程中,将数据处于锁定状态
  • 本系统当前的其他事务,解释:每次数据连接 connection 会产生一次会话 session , 会话 session 中可产生多个事务 transaction ,而一个事务 transaction 只能在一个会话 session 中;即 session 与 transaction 的关系

实现:

  • 基于MySQL提供的锁机制,保证数据访问的排他性

前提:

  • 1、数据库存储引擎ENGINE需支持事务:
  • 1.1、MyISAM存储引擎不支持事务,不可以在MyISAM存储引擎上实现事务相关的操作,即使设置了也无效;
  • 1.2、InnoDB存储引擎支持事务;
  • 2、关闭数据库的自动提交,即修改autocommit的值;autocommit 默认为1;MySQL默认运行在 autocommit 模式上,即每执行完毕一个更新操作,立即将结果存储到磁盘上;
  • 2.1、autocommit = 1 ,默认,允许自动提交,即每一个操作都是一个独立的事务,都会独立的提交;
  • 2.2、autocommit = 0 ,需要手动 commit 或 rollback 才会生效;可以将多个语句放在一个事务中,若失败,统一回滚操作;
  • 即设置 autocommit = 0,可以开启事务,手动提交 commit / rollback

问题

  • 为什么要支持事务?因为一个事务是一个连续的一组数据库操作,它是一个单一的工作单元进行;事务是访问并更新数据库中各种数据项的一个程序执行单元;举例:A转账给B,A账户扣款,B账户增款,是一个连续的数据库操作
  • 为什么要关闭自动提交,即设置 autocommit = 0 ?因为MySQL默认使用autocommit模式,默认是允许自动提交,即当执行一个更新操作后,MySQL会立刻将结果进行提交;而悲观锁需要将被修改的数据锁定,如果是一组操作,要等到这一组操作都完成后再整体提交,如果失败则整体回滚到初始状态,而不是每一步操作提交一次;举例:A转款B,A扣款成功,但B收款失败,所以A扣款操作应 rollback 回滚,而不是 A扣款这一个子操作步骤成功

应用

  • C/S结构

二、悲观锁使用

对于单个事务,设置 autocommit = 0 后,对数据更新操作后,需要手动 commit

对于连续的数据操作时
更新操作前设置 autocommit = 0
开启事务 begin / begin work / start transaction
数据操作
手动提交 commit / rollback
更新设置 autocommit = 1 ,保证不同事务间修改可见

参考资料

  • mysql悲观锁总结和实践
  • MySQL 事务与锁定命令 BEGIN/COMMIT/ROLLBACK 句法 缺省的,MySQL 运行
原创粉丝点击