• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > Mysql 行级锁的使用及死锁的预防方案

Mysql 行级锁的使用及死锁的预防方案

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了Mysql,行级锁,死锁等相关知识,希望本文的分享对您有所帮助

Mysql关系型数据库管理系统

MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司。MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。


mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务。使用mysql锁的时候有时候会出现死锁,要做好死锁的预防。这篇文章通过实例应用给大家讲解

一、前言

    mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务。使用mysql锁的时候有时候会出现死锁,要做好死锁的预防。

二、MySQL行级锁

    行级锁又分共享锁和排他锁。

    共享锁:

      名词解释:共享锁又叫做读锁,所有的事务只能对其进行读操作不能写操作,加上共享锁后其他事务不能再加排他锁了只能加行级锁。

      用法:

SELECT `id` FROM table WHERE id in(1,2)  LOCK IN SHARE MODE

结果集的数据都会加共享锁

    排他锁:

      名词解释:若某个事物对某一行加上了排他锁,只能这个事务对其进行读写,其他事务不能对其进行加任何锁,其他进程可以读取,不能进行写操作,需等待其释放。

      用法:

SELECT `id` FROM mk_user WHERE id=1 FOR UPDATE

三、实例应用

<?php
  $uid=$_SESSION['uid'];
  //开启事务
  sql:begin
  //开启行级锁的排他锁
  sql:SELECT `coin` FROM user WHERE id=$uid FOR UPDATE 
  //扣除用户账户钱币
  $res=update user set coin=coin-value where id=1;
  if($res){
   //将用户的提现信息添加到提现表
   sql:insert into user values(null,"{$uid}",value);
   //判断添加结果
   if(add_cash_result){
    sql:commit
   }else{
    sql:rollback
   }
  }else{
   sql:rollback;
  }

 其实步骤不复杂,就是开启事务判断各个结果为真就提交为假就回滚。单个排他锁没有什么问题,当一个表关联到多个排他锁的时候要注意防止发生死锁。

四、死锁

    `id` 主键索引

    `name` index 索引

    `age` 普通字段

    死锁产生的根本原因是两个以上的进程都要求对方释放资源,以至于进程都一直等待。在代码上是因为两个或者以上的事务都要求另一个释放资源。

    死锁产生的四个必要条件:互斥条件、环路条件、请求保持、不可剥夺,缺一不可,相对应的只要破坏其中一种条件死锁就不会产生。

    例如下面两条语句 第一条语句会优先使用`name`索引,因为name不是主键索引,还会用到主键索引

    第二条语句是首先使用主键索引,再使用name索引 如果两条语句同时执行,第一条语句执行了name索引等待第二条释放主键索引,第二条执行了主键索引等待第一条的name索引,这样就造成了死锁。

    解决方法:改造第一条语句 使其根据主键值进行更新

#①
update mk_user set name ='1' where `name`='idis12';
#②
update mk_user set name='12' where id=12;
//改造后
update mk_user set name='1' where id=(select id from mk_user where name='idis12' );

以上就是Mysql 行级锁的使用及死锁的预防方案的内容,更多相关内容请关注微课江湖()!

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 分享下mysql各个主要版本之间的差异
  • MySQL essential版本和普通版本有什么区别?
  • redhat 5.4下安装MYSQL全过程
  • 如何用SQL命令查看Mysql数据库大小
  • 解析mysql中如何获得数据库的大小
  • 解析mysql修改为utf8后仍然有乱码的问题
  • 5个常用的MySQL数据库管理工具详细介绍
  • 解析在MySQL里创建外键时ERROR 1005的解决办法
  • 解析远程连接管理其他机器上的MYSQL数据库
  • mysql 精简过程(删除一些文件)

相关文章

  • 2017-05-11分享MySQL的自动化安装部署的方法
  • 2018-12-05 MongoDB学习
  • 2018-12-05安装SQL2005 29506错误码的解决方案
  • 2018-12-05MySQL优化配置文件my.ini(discuz论坛)
  • 2018-12-05oracle10g 数据备份与导入
  • 2018-12-05Memcached的工作原理是什么?
  • 2018-12-05MySQL服务器时间同步问题
  • 2017-05-11mysql 备份与迁移 数据同步方法
  • 2017-05-11MYSQL中常用的强制性操作(例如强制索引)
  • 2018-12-05使用PDO操作MySQL数据库的实例分享(收藏)

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • MySQL 基础知识小结
    • Access数据库提示OleDbException (0x80004005): 操作必须使用一
    • Oracle数据库输出输入
    • 详细介绍MySQL临时表与派生表
    • 一个比较实用的大数据量分页存储过程
    • SSL连接的实例教程
    • 解析mysql 缓存如何使用内存
    • Centos中彻底删除Mysql(rpm、yum安装的情况)
    • Mysql存储引擎之Innodb存储引擎的介绍
    • MySQL的字符集操作命令总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有