新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一个事务会在表上加锁,不管是查询还是修改,只是锁的类型不同,共享锁或是排他锁。
创新互联建站主要从事成都网站建设、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务松岭,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108
这与设定的隔离级和做的操作有关。
估计楼主关心的是非共享锁表,下面给出我所了解的几种情况
1.lock table in exclusive mode
2.隔离级设为RR,并执行修改操作
3.如果更新行数太多,可能会由行级锁升级为表锁
1、数据库锁表的意思:因为在数据库里,同一个数据可能有多个人来读取或更改,为了防止我更改的时候别人也同时更改,这是一般要锁住表不让别人改。
2、举个简单例子:在更新数据库记录的过程中,我是不希望别人也来更新我的这些记录的,像库存,做出库的时候,原数量100,我出了20,我就需要把数量更新到80;
在更新的过程中,别人又做了30的出库,如果在我更新的时候,别人先把库存更新到70,然后我又更新80,那数量就错误了。所以我更新的时候,我就需要锁定这条记录。这是数据行锁,排他锁。
扩展资料:
数据库锁表的必要条件:
1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
如果条件中确定使用了索引,则会锁该行,如没有索引或没使用到索引,则会锁表。
是否使用到索引,利用trace工具判断,这里不做叙述。
建议用主键做索引验证
先打开两个连接session
注:session1此时未提交
session2修改当前数据被阻塞,因为修改属于特殊读这里会使用当前读,修改阻塞说明session1事务加了锁。但此时不能判断是行锁还是表锁。
将session1提交后,session2随即成功提交,这里阻塞了20s左右
session2修改其他数据正常执行,说明锁的是行锁,不是表锁。
session2查询操作正常,因为普通读时由于mysql的mvcc机制会使用的是快照度,所以不会阻塞。
mvcc当前读与快照读及其相关原理这里不做叙述
注:session1此时未提交
session2修改当前数据被阻塞,因为修改属于特殊读这里会使用当前读,修改阻塞说明session1事务加了锁。但此时不能判断是行锁还是表锁。
将session1提交后,session2随即成功提交,这里阻塞了20s左右
session2修改其他数据被阻塞,说明锁的是表锁,不是行锁。
将session1提交后,session2随即成功提交,这里阻塞了20s左右
session2查询操作正常,因为普通读时由于mysql的mvcc机制会使用的是快照度,所以不会阻塞。
mvcc当前读与快照读及其相关原理这里不做叙述
注:for update只有在begin commit,也就是事务之间才会起作用,如果发现两个session都成功对一条数据加锁成功,注意看下是否有没有开启事务。
先打开两个连接session
注:session1此时未提交
由于session1加了锁,session2查询加锁被阻塞,但此时不能判断是行锁还是表锁。
将session1提交后,session2随即成功加锁,这里阻塞了20s左右
session2加锁其他数据正常执行,说明锁的是行锁,不是表锁。
session2修改当前数据被阻塞
session2修改其他数据正常执行
注:session1此时未提交
由于session1加了锁,session2查询加锁被阻塞,但此时不能判断是行锁还是表锁。
将session1提交后,session2随即加锁成功,这里阻塞了20s左右
session2加锁其他数据也被阻塞,说明锁的是表锁,不是行锁。
将session1提交后,session2随即加锁成功,这里阻塞了20s左右
session2修改当前数据被阻塞,但此时不能判断是行锁还是表锁。
将session1提交后,session2随即修改成功,这里阻塞了20s左右
session2修改其他数据同样被阻塞,说明锁的是表锁,不是行锁。
将session1提交后,session2随即修改成功,这里阻塞了20s左右
DML锁又可以分为,行锁、表锁、死锁 -行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁。 -表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新。