事务ACID属性
- 原子性:事务中的所有操作可以看作为原子,要么都成功,要么都失败。mysql通过回滚日志实现数据回归,保持原子性。事务进行中优先记录回滚日志,然后再操作数据。回滚日志不能将数据库直接还原为提交前的样子,保存的记录为逻辑日志(比如保存一条数据,相对应有一条删除数据)
- 持久性:事务提交后,数据将永久保存。mysql根据重做日志保证数据的持久性,当事务提交时,服务器发生宕机,将根据重做日志中事务已提交但未更新磁盘数据进行持久化。当一条数据被修改时,先把数据保存内存中,并生成一条重做日志保存在缓存中;当事务提交时,将内存中的数据持久化到磁盘,重做日志也进行持久化(重做日志具有原子性)
- 隔离性:锁实现,事务间互不干扰。一共有四种隔离性
- 未提交读,一个事务查询到另一个事务未提交数据(脏读)
- 提交读,一个事务中两次查询可能查出不同数据(不可重复读)
- 可重复读,一个事务中每次查询到的数据集相同(幻读)
- 串性化
- 一致性
锁
行锁
mysql数据引擎innoDB,支持事务,默认使用行锁,行锁开销大但粒度小,并发处理能力高。当执行insert、update、delete默认加锁,select不加锁。
- 共享锁(读锁 lock in share mode),支持多个查询操作共同执行
- 排他锁(写锁 for update),当事务未提交之前,禁止其他事务对数据进行加锁(读锁、写锁),阻塞等待
表锁
MyISAM默认使用表锁,开销小但并发处理能力低。
当使用innoDB存储引擎时,查询语句条件未非索引字段,行锁将升级为表锁。当进行全表检索
、多表查询时使用表锁