Spring事务的传播属性和事务隔离级别

  • 时间:
  • 浏览:9

2: non-repeatable reads--数据不可重复读。比如事务A中两处读取数据-total-的值。在第一读的很久,total是5000,因此 事务B就把total的数据改成 500,事务A再读一次,结果就发现,total竟然就变成500了,造成事务A数据混乱。

Spring默认情况汇报下会对运行期例外(RunTimeException),即uncheck异常,进行事务回滚。

可能遇到checked异常就不回滚。

当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,没办法 当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的情况汇报运行完,再继续ServiceA.methodA的事务。

PROPAGATION_REQUIRES_NEW 完很久另另一个新的事务,它与内部内部结构事务相互独立; 而 PROPAGATION_NESTED 则是内部内部结构事务的子事务, 可能内部内部结构事务 commit, 嵌套事务也会被 commit, 类似规则同样适用于 roll back.

1、可能ServiceB.methodB可能提交,没办法 ServiceA.methodA失败回滚,ServiceB.methodB也将回滚。

3: phantom reads--幻象读数据,类似和non-repeatable reads类似,也是同另另一个事务中多次读不一致的问题报告 。因此 non-repeatable reads的不一致是可能他所要取的数据集被改变了(比如total的数据),因此 phantom reads所要读的数据的不一致却很久他所要读的数据集改变,而是我 他的条件数据集改变。比如Select account.id where account.name="ppgogo*",第一次读去了6个符合条件的id,第二次读取的很久,可能事务b把另另一个帐号的名字由"dd"改成"ppgogo1",结果取出来了7个数据。

场景: 不管业务逻辑的service与非 有异常,Log Service都应该才能记录成功,而是我Log Service的传播属性能才能配为此属性。最下面可能贴出配置代码。

PROPAGATION_NEVER -- 以非事务最好的最好的最好的办法执行,可能当前处于事务,则抛出异常。

参考: https://blog.csdn.net/it_man/article/details/50074371

PROPAGATION_SUPPORTS -- 支持当前事务,可能当前没办法 事务,就以非事务最好的最好的最好的办法执行。

少数数据库默认的隔离级别为Repeatable Read, 如MySQL InnoDB存储引擎

理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是:

比如朋友设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_NESTED,没办法 当执行到ServiceB.methodB的很久,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起另另一个新的子事务并设置savepoint,在等待ServiceB.methodB的事务完成很久,他才继续执行。。可能ServiceB.methodB是内部内部结构事务的子事务,没办法

PROPAGATION_NOT_SUPPORTED -- 以非事务最好的最好的最好的办法执行操作,可能当前处于事务,就把当前事务挂起。

数据库提供了类似事务隔离级别, 不同的隔离级别采用不同的锁类开来实现.

只要当前正要执行的事务没办法 了另外另另一个事务里,没办法 就起另另一个新的事务

比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 没办法 可能执行ServiceA.methodA的很久

(1)、可能ServiceA.methodA可能起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到其他人可能运行在ServiceA.methodA的事务内部内部结构,就不再起新的事务。这时能才能了内部内部结构事务因此 朋友是共用的,而是我这时ServiceA.methodA可能ServiceB.methodB无论哪个处于异常methodA和methodB作为另另一个整体都将共同回滚

(2)、可能ServiceA.methodA没办法 事务,ServiceB.methodB就会为其他人分配另另一个事务。从前,在ServiceA.methodA中是没办法 事务控制的。而是我 在ServiceB.methodB内的任何地方跳出 异常,ServiceB.methodB可能被回滚,不必引起ServiceA.methodA的回滚

它要求事务管理器可能使用JDBC 3.0 Savepoint API提供嵌套事务行为(如Spring的DataSourceTransactionManager)

2、REPEATABLE READ:保证了另另一个事务不必修改可能由从前事务读取但未提交(回滚)的数据。防止了“脏读取”和“不可重复读取”的情况汇报,因此 带来了更多的性能损失。

可能当前在事务中,即以事务的形式运行,可能当前不再另另一个事务中,没办法 就以非事务的形式运行 。

PROPAGATION_REQUIRES_NEW -- 新建事务,可能当前处于事务,把当前事务挂起。

PROPAGATION_MANDATORY -- 支持当前事务,可能当前没办法 事务,就抛出异常。

还要在另另一个事务中运行。也而是我 说,他能才能了被另另一个父事务调用。因此 ,他就要抛出异常

朋友知道并行能才能提高数据库的吞吐量和传输速率,因此 并很久所有的并发事务都能才能并发运行,这还要查看数据库教材的可串行化条件判断了。

在 spring的 TransactionDefinition接口中一共定义了六种事务传播属性:

PROPAGATION_NESTED -- 可能当前处于事务,则在嵌套事务内执行。可能当前没办法 事务,则进行与PROPAGATION_REQUIRED类似的操作。

4、Read Uncommitted:保证了读取过程中不必读取到非法数据。隔离级别在于防止多事务的并发问题报告 。

1、Serializable:最严格的级别,事务串行执行,资源消耗最大;

能才能了在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,没办法 ServiceB.methodB就要抛出异常了。

确保以上条件都满足后, 你就能才能尝试使用 PROPAGATION_NESTED 了.

所谓事务的嵌套而是我 另另一个事务最好的最好的最好的办法之间相互调用。spring事务开启 ,可能是基于接口的可能是基于类的代理被创建(注意一定而是我 代理,能才能了手动new 另另一个对象,因此 此类(与非 接口都行)一定要被代理——spring中的bean只要纳入了IOC管理很久被代理的)。而是我在同另另一个类中另另一个最好的最好的最好的办法调用从前最好的最好的最好的办法有事务的最好的最好的最好的办法,事务是不必起作用的

1: Dirty reads--读脏数据。也而是我 说,比如事务A的未提交(还依然缓存)的数据被事务B读走,可能事务A失败回滚,会是因为 事务B所读取的的数据是错误的。

3、READ COMMITTED:大多数主流数据库的默认事务等级,保证了另另一个事务不必读到从前并行事务已修改但未提交的数据,防止了“脏读取”。该级别适用于大多数系统。

大多数数据库的默认隔离级别为: Read Commited,如Sql Server , Oracle.

前另一个策略类似于EJB CMT,第七个(PROPAGATION_NESTED)是Spring所提供的另另一个特殊变量。

开始 另另一个 "嵌套的" 事务, 它是可能处于事务的另另一个真正的子事务. 潜套事务开始 执行时, 它将取得另另一个 savepoint. 可能类似嵌套事务失败, 朋友将回滚到此 savepoint. 潜套事务是内部内部结构事务的一部分, 能才能了内部内部结构事务开始 后它才会被提交.

PROPAGATION_REQUIRED -- 支持当前事务,可能当前没办法 事务,就新建另另一个事务。这是最常见的挑选。

朋友首先说并发中可能处于的3中不讨人喜欢的事情

在类似隔离级别中, Serializable的级别最高, Read Uncommited级别最低.

2、可能ServiceB.methodB失败回滚,可能他抛出的异常被ServiceA.methodA的try..catch捕获并防止,ServiceA.methodA事务仍然可能提交;可能他抛出的异常未被ServiceA.methodA捕获防止,ServiceA.methodA事务将回滚。

启动另另一个新的, 不依赖于环境的 "内部内部结构" 事务. 类似事务将被删剪 commited 或 rolled back 而不依赖于内部内部结构事务, 它拥有其他人的隔离范围, 其他人的锁, 等等. 当内部内部结构事务开始 执行时, 内部内部结构事务将被挂起, 内务事务开始 时, 内部内部结构事务将继续执行.

比如朋友设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,没办法 当执行到ServiceB.methodB的很久,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起另另一个新的事务,在等待ServiceB.methodB的事务完成很久,他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。可能ServiceB.methodB是新起另另一个事务,没办法 而是我 处于另另一个不同的事务。

(1)、可能ServiceB.methodB可能提交,没办法 ServiceA.methodA失败回滚,ServiceB.methodB是不必回滚的。

(2)、可能ServiceB.methodB失败回滚,可能他抛出的异常被ServiceA.methodA的try..catch捕获并防止,ServiceA.methodA事务仍然可能提交;可能他抛出的异常未被ServiceA.methodA捕获防止,ServiceA.methodA事务将回滚。