FOR UPDATE

1. for update的使用场景
`若是遇到存在高并发而且对于数据的准确性颇有要求的场景,是须要了解和使用for update的。     好比涉及到金钱、库存等。通常这些操做都是很长一串而且是开启事务的。若是库存刚开始读的时候是1,而立马另外一个进程进行了update将库存更新为0了,而事务尚未结束,会将错的数据一直执行下去,就会有问题。因此须要for upate 进行数据加锁防止高并发时候数据出错。     记住一个原则:一锁二判三更新 2. for update如何使用     使用姿式:     select * from table where xxx for update 3. for update的锁表     InnoDB默认是行级别的锁,当有明确指定的主键时候,是行级锁。不然是表级别。     例子: 假设表foods ,存在有id跟name、status三个字段,id是主键,status有索引。     例1: (明确指定主键,而且有此记录,行级锁)     SELECT * FROM foods WHERE id=1 FOR UPDATE;     SELECT * FROM foods WHERE id=1 and name=’咖啡色的羊驼’ FOR UPDATE;     例2: (明确指定主键/索引,若查无此记录,无锁)     SELECT * FROM foods WHERE id=-1 FOR UPDATE;     例3: (无主键/索引,表级锁)     SELECT * FROM foods WHERE name=’咖啡色的羊驼’ FOR UPDATE;     例4: (主键/索引不明确,表级锁)     SELECT * FROM foods WHERE id<>’3’ FOR UPDATE;     SELECT * FROM foods WHERE id LIKE ‘3’ FOR UPDATE; 4. for update的注意点     1.for update 仅适用于InnoDB,而且必须开启事务,在begin与commit之间才生效。     2.要测试for update的锁表状况,能够利用MySQL的Command Mode,开启二个视窗来作测试。 5. for update的疑问点     当开启一个事务进行for update的时候,另外一个事务也有for update的时候会一直等着,直到第一个事务结束吗?     答:会的。除非第一个事务commit或者rollback或者断开链接,第二个事务会立马拿到锁进行后面操做。     若是没查到记录会锁表吗?     答:会的。表级锁时,无论是否查询到记录,都会锁定表。 --------------------- 做者:m0_37638272 来源:CSDN 原文:https://blog.csdn.net/m0_37638272/article/details/81240051 版权声明:本文为博主原创文章,转载请附上博文连接!
相关文章
相关标签/搜索