事务隔离级别和传播机制
1:事务
事务:一组逻辑操作单元,使数据从一种状态变换为另一种状态。
逻辑操作单元: 一个或者多个DML操作。
事务处理(事务操作):保证所有的事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式,当在一个事务中执行多个操作的时候,要么所有的事务都被提交(commit),那么这些修改就会被永久的保持,要么数据库管理系统将放弃所有的修改,进行回滚(rollback)到最初状态。
回滚的意义:
为了确保数据库中数据的一致性,数据的操作应该是离散的成组的逻辑单元,当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应该全部视为错误,所有的从起始点以后的操作全部退回到最初状态。
2:事务的原子性(ACID)
原子性:Atomicity ,事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性:Consistency,事务必须使得数据库从一个 一致性状态变化到另一个 一致性状态。
隔离性:Isolation,事物的隔离性是指一个事务的执行不能被其他的事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行各个事务之间不能相互干扰。
持久性:Durability,持久性是指任何一个事务一旦被提交,它对数据库中数据的改变是永久性的,接下来的其他操作和数据库故障不应该对其产生影响。
3:并发操作的影响
4:四种隔离级别
5:事务传播机制
一.名词理解
脏读:事务1第二次读取时读取到了事务2未提交的数据
不可重复读:事务2在事务1第二次读取时,提交了数据。导致事务1前后两次读取的数据不一致
幻读:事务1在第二次读取数据时读取到了事务2提交的数据
不可重复读和幻读的区别:
不可重复读针对的是读取到的值不同,幻读针对的是读取到的数据条数不同
二.事务的隔离级别由高往低
1.SERIALIZABLE 可串行读
这是效率最低最耗费资源的一个事务级别,和可重复读类似,但在自动提交模式关闭情况下可串行化读会给每个查询加上共享锁和排他锁,意味着所有的读操作之间不阻塞,但读操作和阻塞別的食物的写操作,写操作也阻塞读操作
2.REPEATABLE READ 可重读读取数据,这也是Mysql默认的隔离级别
一个事务内的两次无所查询返回的数据都是一样的,但别的事务的新增数据也能读取到,比如另一个事务插入了一条数据并提交,这个事务第二次去读取的时候发现多了一条之前查询数据列表里面不存在的数据,这个级别避免了不可重复读取,但不能避免幻读的问题
3.READ COMMITTED 读取已提交的数据
一个事务只能读取数据库中已经提交过的数据,解决了脏读的问题,但不能重复读,即一个事务内的两次查询返回的数据是不一样的,如第一次查询金额100,第二次去查询可能就是50了,这就是不可重复读取.
4.READ UNCOMMITTED 读取未提交的数据
这是最不安全的一种级别,查询语句在无锁的情况下运行,并能读取到别的未提交的数据,造成脏读,如果未提交的那个事务数据全部回滚了,而之前读取了这个事务的数据即未脏数据。
上面介绍了4种事务隔离级别及脏读、不可重复读、幻读与它们的联系,对应的关系表如下:
三.事务传播机制
1.REQUIRED 如果当前方法没有事务则加入事务,没有则创建一个事务
2.NOT_SUPPORTED 不支持事务,如果当前有事务则挂起事务运行
3.REQUIREDS_NEW 新建一个事务并在这个事务中运行,如果当前存在事务就把当前事务挂起,新建的 事务的提交与回滚一挂起事务没有联系,不会影响挂起事务的操作
4.MANDATORY 强制当前方法使用事务运行,如果当前没有事务则抛出异常
5.NEVER 当前方法不能存在事务,即非事务运行,如果存在事务则抛出异常
6.SUPPORTS 支持当前事务,如果当前没事务也支持非事务状态运行
7.NESTED 如果当前存在事务,则在嵌套事务内执行,嵌套事务的提交与回滚与父事务没有任务关系,反之,当父事务提交嵌套事务也一起提交,父事务回滚会也回滚嵌套事务的,如果当前没有事务,则新建一个事务运行.