Spring 事务隔离级别和传播行为

Spring 事务隔离级别和传播行为一 spring 支持的事务声明方式编程式事务当系统需要明确的 细粒度的控制各个事务的边界 应选择编程式事务 声明式事务当系统对于事务的控制粒度较粗时 应该选择声明式事务二 spring 支持 7 种事务传播行为传播行为含义 propagation required xml 文件中为 required 表示当前方法必须在一个具有事务的上下文中运行 如有客户端有事务在进行 那么被调用端将在该事务中运行 否则的话重新开启一个事务 如果被调用端发生异常 那么调用端和被调用端事

一、spring支持的事务声明方式

  1. 编程式事务 当系统需要明确的,细粒度的控制各个事务的边界,应选择编程式事务。
  2. 声明式事务 当系统对于事务的控制粒度较粗时,应该选择声明式事务

二、spring支持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) 表示该方法不应该在一个事务中运行。如果有一个事务正在运行,它将在运行期被挂起,直到这个事务提交或者回滚才恢复执行
  1. 当业务方法被设置为propagation_mandatory时,它就不能被非事务的业务方法调用。
    如将ForumService#addTopic ()设置为propagation_mandatory,如果展现层的Action直接调用addTopic()方法,将引发一个异常
    正确的情况是: addTopic()方法必须被另一个带事务的业务方法调用
    所以 propagation_mandatory的方法一般都是被其它业务方法间接调用的。


  2. 当业务方法被设置为propagation_never时,它将不能被拥有事务的其它业务方法调用。假设UserService#addCredits ()设置为propagation_never,当ForumService# addTopic()拥有一个事务时,addCredits()方法将抛出异常。所以propagation_never方法一般是被直接调用的
  3. 当方法被设置为propagation_not_supported时,外层业务方法的事务会被挂起,当内部方法运行完成后,外层方法的事务重新运行。如果外层方法没有事务,直接运行,不需要做任何其它的事

三、spring中的事务隔离级别

隔离级别 含义
isolation_default 使用数据库默认的事务隔离级别
isolation_read_uncommitted 允许读取尚未提交的修改,可能导致脏读、幻读和不可重复读
isolation_read_committed 允许从已经提交的事务读取,可防止脏读、但幻读,不可重复读仍然有可能发生
isolation_repeatable_read 对相同字段的多次读取的结果是一致的,除非数据被当前事务自生修改。可防止脏读和不可重复读,但幻读仍有可能发生
isolation_serializable 完全服从acid隔离原则,确保不发生脏读、不可重复读、和幻读,但执行效率最低
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177497.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午7:22
下一篇 2026年3月26日 下午7:22


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号