mysql在操作表的时候,表是否被锁定

时间:2022-09-21 22:48:45
假如A终端要插入一条记录,并且要获得刚插入的记录的id。如果还没有获得刚插入的id前,B终端却插入了一条记录,这时候,A终端有可能得到是B终端刚插入的记录的id.

我想问的是这时候我们操作的表会被锁定吗

12 个解决方案

#1


和数据库类型也有关,是会发生死锁,例如一次插入百万数据耗时五分钟之类的,会影响其他人查询,这也是自身锁机制吧,但A不会得到B返回的id,这样就乱套了,具体没太研究过,全当顶起~ mysql在操作表的时候,表是否被锁定

#2


我猜应该不会吧,要人为设置,不然高并发下怎么使用数据库呢!

#3


应该不会吧!如果id设置为主键且为自增的话,B就根本不会得到A的id,所以你说的那种情况不会发生,否则如果遇到高并发,就乱套了...

#4


是的 这时候我们操作的表会被锁定
在你没有关闭数据库连接之前,其他用户对数据库的任何操作都不会反映到你这里
可以这样理解:连接数据库后,操作的只是数据库的一个副本

#5


数据库有自己的机制来处理这些问题。
你这种现象是传输延迟的问题。

#6


mysql_insert_id  获取的id是安全独立的。你可以放心使用

#7


恩,谢谢大家

#8


mysql_insert_id()可以安全的返回a的id,至於是否會亂套的問題這是mysql自身需要處理的基本操作,你想太多了,钻了牛角尖

#9


还是有可能的啊 
不然为什么 sql 要 lock table 的操作? 数据库不会自己处理这种并发冲突的吧? 

#10


4楼正解,

#11


那就是说看不到表里的全局数据了? 

假如:  数据表有两个字段 id, url;
规定 id 是自增,为主键。 url 保持唯一。

则客户端插入一个新 url 的操作是: 先查看数据表存不存在 url, 没有则 insert, 否则什么都不做。

照楼上说法: 两个客户端要插入相同一个 url,最后会插入2份?  






引用 10 楼  的回复:
4楼正解,

#12


怎么没有人讨论了啊~~

#1


和数据库类型也有关,是会发生死锁,例如一次插入百万数据耗时五分钟之类的,会影响其他人查询,这也是自身锁机制吧,但A不会得到B返回的id,这样就乱套了,具体没太研究过,全当顶起~ mysql在操作表的时候,表是否被锁定

#2


我猜应该不会吧,要人为设置,不然高并发下怎么使用数据库呢!

#3


应该不会吧!如果id设置为主键且为自增的话,B就根本不会得到A的id,所以你说的那种情况不会发生,否则如果遇到高并发,就乱套了...

#4


是的 这时候我们操作的表会被锁定
在你没有关闭数据库连接之前,其他用户对数据库的任何操作都不会反映到你这里
可以这样理解:连接数据库后,操作的只是数据库的一个副本

#5


数据库有自己的机制来处理这些问题。
你这种现象是传输延迟的问题。

#6


mysql_insert_id  获取的id是安全独立的。你可以放心使用

#7


恩,谢谢大家

#8


mysql_insert_id()可以安全的返回a的id,至於是否會亂套的問題這是mysql自身需要處理的基本操作,你想太多了,钻了牛角尖

#9


还是有可能的啊 
不然为什么 sql 要 lock table 的操作? 数据库不会自己处理这种并发冲突的吧? 

#10


4楼正解,

#11


那就是说看不到表里的全局数据了? 

假如:  数据表有两个字段 id, url;
规定 id 是自增,为主键。 url 保持唯一。

则客户端插入一个新 url 的操作是: 先查看数据表存不存在 url, 没有则 insert, 否则什么都不做。

照楼上说法: 两个客户端要插入相同一个 url,最后会插入2份?  






引用 10 楼  的回复:
4楼正解,

#12


怎么没有人讨论了啊~~