MYSQL多线程并发操作同一张表同一个字段的问题有什么办法解决吗?被操作...

发布网友

我来回答

2个回答

热心网友

在MySQL 8.0 之前, 我们假设一下有一条烂SQL,

mysqlselect * from t1 order by rand() ;

以多个线程在跑,导致CPU被跑满了,其他的请求只能被阻塞进不来。那这种情况怎么办? 


大概有以下几种解决办法:

热心网友

可以用乐观锁方案解决

在表里增加个字段,版本号

每次更新前先从数据库里获取这个版本号的值,然后更新时要同步更新版本号+1,并且增加更新条件版本号=查询出来的值。

因为更新时每次只可能有一个线程更新到数据,等到另外一个线程再去更新数据的时候版本号已经+1了,所以会更新失败,重新获取版本号再走更新流程,这样就解决了多线程并发更新被覆盖的问题。

而且乐观锁机制避免了长事务中的数据库加锁开销(多个线程操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系统整体性能表现。

追问那如何并发相当大,有两个或多个线程在同一个时间获取到版本号相同怎么办?这不同样会出现覆盖的问题吗?

追答就算有多个线程都取到了相同的版本号,也不会出现更新被覆盖的问题。
假设取到的版本号为1,更新语句中*条件where版本号=1,这样只会有一个线程更新成功,因为这个线程更新成功后版本号就会变成2,那其他线程通过条件版本号=1去更新就失败了,所以不会出现更新被覆盖的问题

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com