传播行为:多种事务同事发生.先执行谁,接下来怎么执行
@Transactional(propagation = Propagation.REQUIRED)
public void transaction(int money, int idadd, int idreduce) {
affairImp.update(money, idadd, idreduce);
affairImp.update2(money, idadd, idreduce);
}
一共7个:
"REQUIRED":支持当前事务,如果不存在则创建新事务。
如果现在有事务在处理,之后的所有对数据库操作的事务,都划到这个事务里
如果现在没有事务在处理,则创建新事务处理
"SUPPORTS":支持当前事务,如果不存在,则以非事务方式执行。
如果现在有事务在处理,之后的对数据库操作的事务,都划到这个事务里
如果现在没有事务在处理,之后的对数据库操作的事务,都以非事务的方式,正常的方式处理,不会有回滚的操作
"MANDATORY":支持当前事务,如果不存在则抛出异常。
如果现在有事务在处理,之后的所有对数据库操作的事务,都划到这个事务里
如果现在没有事务在处理,则抛出异常
"REQUIRES_NEW":创建新事务,如果当前事务存在,则挂起当前事务。
不管有没有事务,都先创建一个新事务
如果现在有事务在处理,正在执行的事务挂起,暂停,处理后面数据库操作的事务,
如果现在没有事务在处理,之后的对数据库操作的事务,创建一个新的事务处理
"NOT_SUPPORTED":以非事务方式执行,如果当前事务存在,则挂起当前事务
"NEVER":如果存在非事务性异常,则抛出。
"NESTED":如果当前事务存在,则在嵌套事务中执行,之后的事务大家一起执行。
隔离级别:对事务同时执行时,之间的各种隔离程度,有影响到一点影响都没有
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void transaction(int money, int idadd, int idreduce) {
affairImp.update(money, idadd, idreduce);
}
一共5个:
下面的第一个第二个事务都是同时在执行的,也就是多线程,都是在同时使用的情况下,同时在对数据库操作
"DEFAULT":默认数据存储隔离级别的使用。所有其他级别都对应于JDBC隔离级别。
没有什么隔离程度
"READ_UNCOMMITTED":一个常数,指示可以发生脏读、不可重复读和幻象读。此级别允许由一个事务更改的行在提交该行中的任何更改之前被另一个事务读取(“脏读”)。如果回滚任何更改,则第二个事务将检索到无效行。
第一个事务正在更改数据,还没有确定是否改完,第二个事务可以进来读取到已经被你改过的数据
如果第一个事务最后不想改了,回滚了,第二个事务就报找不到有效数据
"READ_COMMITTED":一个常数,指示防止脏读;可能发生不可重复读和幻象读。此级别仅禁止事务读取包含未提交更改的行。
第一个事务没确定修改完成之前第二个事务不能读取数据,但是你改完之后我可以读取你改完后的数据
也就是同时对数据库操作,第二个事务可能读取到其中的一个数据不是原来的数据,而可能是已经被改过的数据
不可重复读就是重复读,数据会发生变化,不可以多次读,因为每次读都不一样
"REPEATABLE_READ":一个常量,指示阻止脏读和不可重复读;可能发生虚读。此级别禁止事务读取包含未提交更改的行,还禁止一个事务读取行,第二个事务更改行,第一个事务重新读取行,第二次获取不同的值(“不可重复读取”)。
不予许出现一个事物读取2次数据,数据却不一样的情况,但是可以允许读取到添加一个以前不存在的数据
就是只要原来的数据不变,可以在读取到多插入的一条数据
"SERIALIZABLE":一个常量,指示阻止脏读、不可重复读和虚读。此级别包括隔离的“可重复读取”中的禁止,并进一步禁止一个事务读取满足where条件的所有行,第二个事务插入满足where条件的行,第一个事务针对相同条件重新读取,在第二次读取中检索附加的“幻象”行。
都不允许