mysql锁与事务总结

146 阅读2分钟

事务ACID属性

  • 原子性:事务中的所有操作可以看作为原子,要么都成功,要么都失败。mysql通过回滚日志实现数据回归,保持原子性。事务进行中优先记录回滚日志,然后再操作数据。回滚日志不能将数据库直接还原为提交前的样子,保存的记录为逻辑日志(比如保存一条数据,相对应有一条删除数据)
  • 持久性:事务提交后,数据将永久保存。mysql根据重做日志保证数据的持久性,当事务提交时,服务器发生宕机,将根据重做日志中事务已提交但未更新磁盘数据进行持久化。当一条数据被修改时,先把数据保存内存中,并生成一条重做日志保存在缓存中;当事务提交时,将内存中的数据持久化到磁盘,重做日志也进行持久化(重做日志具有原子性)
  • 隔离性:锁实现,事务间互不干扰。一共有四种隔离性
  1. 未提交读,一个事务查询到另一个事务未提交数据(脏读)
  2. 提交读,一个事务中两次查询可能查出不同数据(不可重复读)
  3.  可重复读,一个事务中每次查询到的数据集相同(幻读)
  4. 串性化
  • 一致性

行锁

      mysql数据引擎innoDB,支持事务,默认使用行锁,行锁开销大但粒度小,并发处理能力高。当执行insert、update、delete默认加锁,select不加锁。

  1. 共享锁(读锁 lock in share mode),支持多个查询操作共同执行
  2. 排他锁(写锁 for update),当事务未提交之前,禁止其他事务对数据进行加锁(读锁、写锁),阻塞等待

表锁

       MyISAM默认使用表锁,开销小但并发处理能力低。

当使用innoDB存储引擎时,查询语句条件未非索引字段,行锁将升级为表锁。当进行全表检索

、多表查询时使用表锁