Sorry, by the way. I don't bring direct solutions to your problem and it surely nags on you that things broke that worked before.
I'm not saying you wouldn't have got into any trouble if you would have done things differently already in the past.
But confronted with problems due to a new version, I personally like to combine solving a problem with better solutions I learned in the meantime or learn for solving the current problem. I know it's often not easy, as it possibly goes through all levels of your previous code and all you'd like to get done is things working as they did before.
Some of the solutions, like using UUIDs would obviously be a big hit of refactoring all code, but creating a pseudo sequence as the MySQL documenta tell it will leave you with numeric IDs just like the other solution to that. (for reference:
You don't have to do everything the way I propose, of course. But you should really stop thinking the VFP way of locking rows to establish a semaphore to only update the autoinc value from one client that successfully got the lock on it.
I understand that TABLEUPDATE not working is an issue also outside of generating IDs, so it's something you'd like to fix not by preventing usage of Tableupdate, that's not solving it for general use of MySQL 8 with cursoradapters. But I can assure you VFP and MySQL can work together, provided also in cases you do query data into a CA cursor and finally update it by TABLEUPDATEs. That's not the genral problem. The special case is SELET.. FOR UPDATE, and you don't use that all the time for any other CA.
You surely have overused the VFP way of rlock, then update/replace, then unlock to MySQL with read locks. It's over the top to do that. And so I bet you can overall forget about the option to do SELECT ... FOR UPDATE. I didn't need it in my whole VFP+MySQL usage in any project.
My guess is, as I already said above, this feature will only work if you use the FOR UPDATE option and then do the update in the same call, in the same SQLExec or CA.Cursorfill or whatever other CA event or method, so it can't be split as reading data into a VFP workarea and then release the read lock by the update sent to MySQL via TableUpdate(...,CA.Alias). Even though this worked before. I think MySQL 8 has become more restricted with what it sees as single sessions. Coming in from the same connection isn't sufficient anymore. If MySQL allows START TRANSACTION and COMMIT in two separate calls, that would allow using read locks within a transaction that spans two calls, i.e. the CA SelectCmd and Tableupdate().
But even then, you don't use long lasting transactions, you want to get something updated which you read from a MySQL table with a read lock, then for gods sake, do it fully in MySQL why does it have to come over to VFP and go back? You want to have a short timespan of that transaction and therefore ideally want that to be in the same call anyway, not with any roundtrip from MySQL to VFP and back.
Chriss