事务笔记

事务:
	定义:是数据库管理系统(数据全量)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成
	目的:数据一致和数据隔离
	属性:ACID, 原子性(Atomicty),一致性(Consistency),隔离性(Isolation),持久性(Durability)
		隔离级别(四个级别逐渐增强),每个级别解决一个问题:
			未提交读(READ UNCOMMITTED)。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)。
			提交读(READ COMMITTED)。本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)。
			可重复读(REPEATABLE READ)。在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象(稍后解释)。
			串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥。
			解释:
				脏读:事务发生回滚,事务未提交
				不可重复读:同一个事务中,另一个事务提交了新数据,B读取A数据会导致两次读取不一致
					https://segmentfault.com/a/1190000017755376
				幻读:解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会神奇的发现了这些新数据
			InnoDB默认的隔离级别是REPEATABLE READ,可重复读 
		传播行为:7种事务传播行为,确定客户端和被调用端的事务边界
			PROPAGATION_REQUIRED(XML文件中为REQUIRED)表示当前方法必须在一个具有事务的上下文中运行,如有客户端有事务在进行,那么被调用端将在该事务中运行,否则的话重新开启一个事务。(如果被调用端发生异常,那么调用端和被调用端事务都将回滚)
			PROPAGATION_SUPPORTS(XML文件中为SUPPORTS)表示当前方法不必需要具有一个事务上下文,但是如果有一个事务的话,它也可以在这个事务中运行
			PROPAGATION_MANDATORY(XML文件中为MANDATORY)表示当前方法必须在一个事务中运行,如果没有事务,将抛出异常
			PROPAGATION_NESTED(XML文件中为NESTED)表示如果当前方法正有一个事务在运行中,则该方法应该运行在一个嵌套事务中,被嵌套的事务可以独立于被封装的事务中进行提交或者回滚。如果封装事务存在,并且外层事务抛出异常回滚,那么内层事务必须回滚,反之,内层事务并不影响外层事务。如果封装事务不存在,则同PROPAGATION_REQUIRED的一样
			PROPAGATION_NEVER(XML文件中为NEVER)表示当方法务不应该在一个事务中运行,如果存在一个事务,则抛出异常
			PROPAGATION_REQUIRES_NEW(XML文件中为REQUIRES_NEW)表示当前方法必须运行在它自己的事务中。一个新的事务将启动,而且如果有一个现有的事务在运行的话,则这个方法将在运行期被挂起,直到新的事务提交或者回滚才恢复执行。PROPAGATION_NOT_SUPPORTED(XML文件中为NOT_SUPPORTED)表示该方法不应该在一个事务中运行。如果有一个事务正在运行,他将在运行期被挂起,直到这个事务提交或者回滚才恢复执行
			参考:https://juejin.im/post/5ae9639af265da0b926564e7

  

Unkonw Unkonw(你不知道一样东西,你也会不知道自己不知道这样东西)
原文地址:https://www.cnblogs.com/2014-1130/p/11690771.html