在高并发下,如果我插入一条数据,返回一个insert_id
,那么这个insert_id
会不会为别人所用呢。如果不被别人所用,php是怎么做到访问隔离的。
php层面的“隔离”
这个就是PHP的“特性”---每个请求都是一个进程,php-fpm每次都会分配一个对应的worker来处理这个请求。
每个操作都在对应的php-fpm下属的worker下进行,内存管理也是一样。
处理完这个进程就关闭。
你插入的返回id是在各自请求对应的php-fpm下属的worker内存中,不会出现你说的情况。
mysql层面的“隔离”
跟引擎有关咯。简单说引擎对应的写入处理不同。MyIASM是表锁,Innodb是行锁,都可以在一定程度上避免并发问题。再高的并发,就要用其他的处理方式了,比如队列等等。
php即便是高并发,单进程连数据库还是单个连接的。
insert id是根据mysql连接的上一条insert语句返回的。
所以对于一个php进程,一个mysql连接,返回的insert id是不会混乱的
兄弟啊,你需要看一本书叫数据库原理
,数据库里面有一个概念叫ACID,事务就两种状态,成功和失败。你这边都insert进去了,那就是成功了,就last insert id
也是这个事务的返回值。
MySQL本身也支持并发,开N个connection去同步的insert,也不会有问题,最多就是慢一点。
PS:PHP能写出来多高的并发??
php中一个请求一般新生成一个mysql连接,多个session同时请求mysql插入操作如何同步,这是mysql解决的问题。mysql 插入操作是加锁的,保证了原子性。
@MrGeneral 说的有部分问题,在这里贴出来,大家补充下:
---每个请求都是一个进程,每次都会启动一个php-fpm。
这句话,每个请求都是一个进程,没错,但是每次都会启动一个php-fpm?
这个是不对的,每次都会启动一个fastcgi的进程,但是这个进程是不是每一次都重新创建的,那倒未必,可能是从php-fpm维护的”进程池“里面取的,也就是说,php-fpm负责进程的管理,部分优化,比如cache住啊,避免了每次都创建进程的开销。而php-fpm本身是常驻的。
求反驳~
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
2 回答802 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.3k 阅读
1 回答703 阅读✓ 已解决
——————————————————————————————————————————————————
—————————————————————————————————————————————————