事务
事务读传播行为
· 保证同一个事务中
PROPAGATION_REQUIRED支持当前事务,如果不存在,就新建一个(默认)
PROPAGATION_SUPPORTS支持当前事务,如果不存在,就不适用事务
PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
· 保证没有在同一个事务中
PROPAGATION_REQUIRES_NEW如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
事务隔离级别
DEFAULT这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别;
未提交读(read uncommitted):
事务的修改,即使当前事务没有被提交,对其他事务而言也是可见的。事务可以读取未提交的数据,也称为脏读。这个级别会导致很多问题,性能上也不比其他级别好多少,一般不会使用;
已提交读(read committed):
大部分数据库系统的默认隔离级别都是read committed(Mysql 不是),它表示一个事务只能看到已经提交的事务所做的修改。换个角度来讲,就是一个事务从开始到提交之前,所做的操作对别的操作都是不可见的。此隔离级别也被称为(不可重复读),因为多次执行同样的查询语句,可能会得出不一样的结果,因为可能有别的事务提交了。
可重复读(repeatable read):
repeatable read解决了脏读的问题,该隔离级别保证了在同一个事务中每次读取都是同样的结果,但是还是无法解决幻读的问题。(幻读:指的是当某个事务在读取某个范围内的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再读取该范围内的记录时,会产生幻行;)【这是高性能Mysql中的解释,我的个人理解为:先读取的事务读不到后来新添加的记录,导致读取不准确】。但InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC)解决了幻读的问题,后面我会详细写到。
可串行化的(serializable):
强制事务串行执行,由于可能会导致大量的超时和锁争用,通常不考虑。
MySQL默认:可重复读
Oracle默认:已提交读