看了一下,MYSQL在读写时会自动给表或者行加锁,那为什么还会出现所谓的并发问题?
假如说1000块钱,我2人同时借钱各200,不去控制,mysql不是在写入时会加锁吗,我不去控制,两个写入执行的应该是一个一个来吧,结果应该就剩600块啊,为什么网上有的...
假如说1000块钱,我2人同时借钱各200,不去控制,mysql不是在写入时会加锁吗,我不去控制,两个写入执行的应该是一个一个来吧,结果应该就剩600块啊,为什么网上有的帖子说这样会出现不等于600的情况啊?求解!
展开
2个回答
展开全部
我理解的是:读表的锁表是指在读的过程中上锁,不允许中途还insert其他记录,当读表完毕,获得select结果后,表就解锁了,可以继续新的select或insert等操作。
例子里:2人同时借钱,没有业务锁的话,两个请求发到后端后可能同时去select,此时2次借款操作select余额都是1000(在另一人借200后回写余额800之前),于是2个请求操作各自开始借钱,算出借钱后都剩下800,再分别update进表中,表里余额就是800
如果加业务锁:2个请求到后端后,select余额和借钱后Update按一个事务进行,那第1人select 1000元并借款后剩下800更新进表中,完成第1人借钱事务后,再进行第2人借钱select 剩下的800元并借款后剩下600更新进表中,就可以避免
例子里:2人同时借钱,没有业务锁的话,两个请求发到后端后可能同时去select,此时2次借款操作select余额都是1000(在另一人借200后回写余额800之前),于是2个请求操作各自开始借钱,算出借钱后都剩下800,再分别update进表中,表里余额就是800
如果加业务锁:2个请求到后端后,select余额和借钱后Update按一个事务进行,那第1人select 1000元并借款后剩下800更新进表中,完成第1人借钱事务后,再进行第2人借钱select 剩下的800元并借款后剩下600更新进表中,就可以避免
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |