mysql事务、锁
事务:
目的:
把所有小环节当成一个环节, 小环节一个出错 就整体失败,要么都成功,要么都不成功。
例如:A给B转钱,是两个小环节,A减钱、B加钱,中间任意环节出错,都表示不成功。
排他锁:
介绍:
行级锁,锁住之后,其他人就操作不了该行信息,会陷入阻塞状态直到前面的用户commit或rollback之后才可操作。
使用场景:
例如转钱,一个客户给另一个客户转钱,然后需要两行内容都先上锁保证数据安全,再修改内容,修改完提交,另一个人再操作改行内容。
使用方式:
select 字段 from 表名 where 索引字段=值 for update; // 行级上锁写法,必须是建立了索引字段
需要注意的问题:
1. 有可能造成死锁,例如A给B转钱,B也再给A转钱,A、B同时锁了自己的行数据,之后A等B的锁释放,B等A的锁释放,就成了死锁状态,最后一个会自动报错,第一个人直接锁住他的行数据。
2. for update是加上锁了,只是同for update语句会陷入阻塞,不影响查询语句不加for update的。
排他锁例子:
死锁例子: