mysql 不同的存储引擎表示对应的不同的锁机制,如myisam和memory存储引擎采用的是表级锁(table-level locking);bdb存储引擎采用的是页面锁(page-level locking),但也支持表级锁;innodb存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁.
可以不用加锁,默认已经有加锁.查询时不需要加锁 增、删、改操作时,系统会对表加锁
表锁就是会把整个表都锁住,不能写,行锁只是锁住一行innodb是行锁myisam是表锁innodb安全性更高
手动加锁:表级锁 lock tables tablename read;//共享锁 lock tables tablename write;//排它锁 unlock tables;//解锁 php直接query就行了.除了MyIsam,谁还会无聊到显式加锁?InnoDB直接跑事务默认会触发隐式锁,不需要自己lock和unlock.
就是通常我们所说的锁级别.数据库引擎具有多粒度锁定,允许一个事务锁定不同类型的资源. 为了尽量减少锁定的开销,数据库引擎自动将资源锁定在适合任务的级别. 锁定在较小的粒度(例如行)可以提高并发度,但开销较高,因为如果
SQL SERVER里的锁机制:NOLOCK(不加锁) 此选项被选中时,SQL Server 在读取或修改数据时不加任何锁. 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”
select lock in share mode sets a shared mode lock on the rows read 你可以这样写sql select * from table_name lock in share mode
更改表引擎为 innodb
会产生死锁的,只是没有满足产生死锁的条件.
有两种模式的行锁:1)共享锁:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁. ( Select * from table_name where lock in share mode)2)排他锁:允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和 排他写锁.(select * from table_name where..for update)