spring事务的传播特性--7种
REQUIRED
支持当前事务,如果没有事务会创建一个新的事务
SUPPORTS
支持当前事务,如果没有事务的话以非事务方式执行
MANDATORY(强制性)
支持当前事务,如果没有事务抛出异常
REQUIRES_NEW
创建一个新的事物并挂起当前事务
NOT_SUPPORTED
以非事务执行,如果当前有事务,则将当前事务挂起
NEVER
以非事务执行,如果存在事务,则抛出异常
NESTED(嵌套)
如果当前存在事务,则嵌套事务内执行,如果当前没有事务,则进行REQUIRED
案例:有事务指的是@Transactional(propagation = Propagation.REQUIRED),也就是默认事务
A:方法
method A(){
sql-a--//向stu表中插入数据;
method B();
}
B:方法
method(){
sql-b1--//向stu表中插入数据;
int a= 1/0;
sql-b2--//向stu表中插入数据;
}
1.REQUIRED解析:
如果A方法上有事务,B方法没有事务,结果--一条数据都添加不进去(A方法有了事务,B方法不管有没有事务,都是A事务执行。)
如果A方法没有事务,B方法有事务,则a的数据会添加成功,B的回滚。
2.SUPPORTS解析:
如果A方法有事务,B方法是SUPPORTS,结果为:一条都添加不进去。(A有事务,B是支持事务,B也会使用A的事务)。
如果A没有事务,B为SUPPORTS,结果:a的sql和b1的sql会执行成功(就是没有事务)表里会有a,b1的数据
3.MANDATORY解析:
如果A有事务,B为MANDATORY,结果:一条都加不进去(A有事务,B为强制事务,会加入A的事务)
如果A没有事务,B为MANDATORY,结果:抛出异常:IllegalTransactionStateException,a的数据添加成功。
4.REQUIRES_NEW解析:
如果A有事务,B为REQUIRES_NEW,结果:全部回滚,
如果A没有事务,B为REQUIRES_NEW,结果:a数据添加成功,B方法的全部回滚
5.NOT_SUPPORTED解析:
如果A有事务,B为NOT_SUPPORTED,结果:A的结果回滚,B为不用事务执行。
如果A没有事务,B为NOT_SUPPORTED,结果,全部不用回滚(就是非事务)
6.NEVER解析:
如果A有事务,B为NEVER,结果:全部回滚,
7.NESTED:
如果A有事务,B为NESTED,结果:全部回滚。
如果A没有事务,B为NESTED,结果:a添加成功,b失败回滚(也就是以事务执行)
Mysql的事务隔离级别(4种)
read uncommitted(读未提交)
事务中的修改,即使没有提交也被其他事务读取到,这种情况也叫脏读。
read committed(读已提交)
一个事务开始时,只能看到已经提交的事务所做的修改。两次执行同样的查询,可能会得到不同的结果
repeatable read(可重复读)
会产生幻读。当某个事物在读取某个范围的记录时,另一个事务又在该范围内插入新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。
serializable(可串行化,默认最高级别)