文章目录
- MySQL事务四种特性
- 原子性(atomicity)
- 原子性是什么
- mysql是如何保证事务的原子性的
- 一致性(consistency)
- 一致性是什么
- 怎么保证一致性
- 隔离性(isolation)
- 隔离性是什么
- 怎么保证隔离性
- 查看当前会话隔离级别的SQL语句
- 脏读
- 如何解决脏读
- 不可重复读
- 幻读
- 持久性(durability)
- 持久性是什么
- 怎么保证持久性
MySQL事务四种特性
首先,我们常用的mysql存储引擎是,myisam和innodb两种引擎,想要使用事务就要用innodb引擎,事务一共有四种包括(原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability))简称acid!
原子性(atomicity)
原子性是什么
事务的最小工作单元,要么全成功,要么全失败。
mysql是如何保证事务的原子性的
- mysql数据库通过undo log日志来保证事务的原子性!当事务开始时 undo log会将当前版本记录成日志,undo log日志记录了回滚操作的日志,如果事务失败,则执行undo log日志上的回滚内容。在事务提交之后,undolog并不立即被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。
一致性(consistency)
一致性是什么
事务开始和结束后,数据库的完整性不会被破坏。
怎么保证一致性
- 一致性就是:应用系统从一个正确的状态到另一个正确的状态.而ACID就是说事务能够通过AID来保证这个C的过程.C是目的,AID都是手段。
隔离性(isolation)
隔离性是什么
不同事务之间互不影响
怎么保证隔离性
mysql中有四种隔离级别,利用这四种隔离级别来满足隔离性,默认的隔离级别是可重复读。
查看当前会话隔离级别的SQL语句
查看当前会话的 隔离级别:
select @@tx_isolation;
查看系统的隔离级别:
select@@global.tx_isolation;
设置会话的隔离级别:
set session transaction isolation level 隔离级别;
设置当前系统的隔离级别:
set global transaction isolation level read 隔离级别;
隔离级别为想要设置的隔离级别英文名称
脏读
- 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,修改的数据先存储到Buffer pool中,还没有存粗到磁盘上。这时,另外一个事务也访问这个数据,然后使用了这个数据。
MySQL在更新数据的时候,都是将数据先从磁盘拉到buffer pool中, buffer pool在内存中,在buffer pool中修改完成后再写到磁盘中
如何解决脏读
- 事务隔离级别设置为:read committed及以上。
- 读取时加排它锁(select…for update),事务提交才会释放锁,修改时加共享锁(update …lock in share
mode)。加排它锁后,不能对该条数据再加锁,能查询但不能更改数据。mysql
InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select
…for
update语句,如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁,共享锁下其它用户可以并发读取,查询数据。但不能修改,增加,删除数据。资源共享。
不可重复读
- 不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(重点是修改,同样的条件,你读取过的数据,再次读取出来发现值不一样了),mysql使用MVCC解决不可重复读。
幻读
- 幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。(重点是删除或者新增,同样的条件,第1 次和第 2 次读出来的记录数不一样)mysql使用MVCC和当前读解决幻读问题。
持久性(durability)
持久性是什么
事务提交后,对数据的修改是永久性的,即使系统故障也不会丢失。
怎么保证持久性
- mysql写入数据的时候,每次都是把数据先写入内存,再往磁盘写 redolog,在适当时的时候,把数据写入磁盘。即便断电,重启mysql还是可以通过redolog来恢复数据。