1.Mysql事务及隔离级别
事务的特点:
-
原子性:一荣俱荣,一辱俱辱
-
一致性:比如转账前后账户金额总额保持不变,前后状态都是 一 致性状态
-
隔离性:并发执行的事务不会相互影响,多个用户向同一个账户转账,要保证与按先后次序转账的结果是一样的
-
持久性:事务一旦提交,就会持久化,不会因为故障变化。
-
数据库系统通过并发控制技术和日志回复技术完成事物的完整性
- 并发控制技术:保证事物的隔离性,保证一致性状态。
- 日志恢复技术保证原子性,保证了持久性
原子性实现原理(方便回滚,在InnoDB存储引擎中):
- 在执行语句之前,将数据备份到Undo log,如果错误就进行rollback
- undo log执行原理:每执行一条sql语句,就在log逻辑日志中记录一条相反的记录,如insert<–>delete
持久性原理-redo log(备份最新持久化后的数据):
- 事务提交前,只要将Redo log持久化即可,不需要将数据持久化。
- 若系统崩溃,虽然数据没有对数据库表持久化,但是在log中已经完成,这时只要根据log内容即可完成持久化。
Mysql的隔离级别:
- 读未提交:脏读(事务未提交但是能读到刚才修改的数据)、不可重复读、幻读
- 读已提交:不可重复读(同一个事务中读取数据时不一致)、幻读
注:不可重复读和可重复读之间的区别在于—*不可重复读:两个事务操作同一个表,前一个事务在进行数据修改后,进行提交,结束事务,完成数据持久化修改,后一个事务在没进行commit操作,结束事务之前,依旧能在当前这个事务内*查出,前一个事务提交后的数据。而可重复读:**就是进行提交之后,结束当前事务,才能查出前一个事务提交后的结果。
- 可重复读:幻读–>两个事务操作同一个表,前一个事务在进行数据修改后,并进行提交。后一个事务在***没有进行提交***完成事务之前,在查询后,表内确实不会显示修改后的数据,表面上完成可重复读,但是当你在后一个事务中进行与前一个事务相同的数据修改操作之后,就会报错,显示重复修改,这样就证明,实际上还是发生了不可重复读,这就是幻读。
- 串行化(serializable):无
事务的执行流程:
- 系统为每一个事务开辟一个私有工作区
- 事务读操作,将数据从此盘拷贝到工作区,在执行写操作之前所有更新都作用于工作区
- 事务写操作将数据输出到内存的缓冲区中,后由缓冲区写入磁盘
事务的故障恢复:
2.Mysql隔离性实现:锁机制
锁分类:
-
1.共享锁(lock in share mode):多个事务对同一个数据共享一把锁,但是使对象数据只读,任何事务不得修改。
- 若前一个事务对数据对象进行lock in share mode查询,后一个事务在进行修改时就会阻塞,除非前一个事务进行提交,则后一个是事务的修改就会自动放行,完成修改。
-
2.排他锁(for update):排他锁不能与其他锁共存,当一个事务获取了***数据行的排他锁***,那么其他事务就不能再获取该行的锁,只能由当前获得排他锁的事务可以对数据进行读取和修改。除非当前事务进行提交,则后一个是事务的修改和查询就会自动放行。
-
3.自增锁:针对自增列自增长的一个特殊的表级别锁。
-
锁粒度:记录、表、数据库
-
死锁: