一、序言
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){ mit }else{ sql:rollback }else{ sql:rollback; } 实际上流程不负杂,便是打开事务管理分辨每个結果为真就递交为假就回退。单独排他锁沒有甚么难题,当一个表关系到好几个排他锁的情况下要留意避免产生死链接。 四、死链接`id` 主键数据库索引 `name` index 数据库索引 `age` 一般字段名 死链接造成的压根缘故是2个之上的过程必须求另一方释放出来資源,以致于过程都一直等候。在编码上是由于2个或是之上的事务管理必须求另外一个释放出来資源。 死链接造成的四个必需标准:互斥标准、环路标准、恳求维持、不能夺走,缺一不能,相对性应的要是毁坏在其中一种标准死链接也不会造成。 比如下边两根句子 第一条句子会优先选择应用`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 (责任编辑:admin) |