当前位置:首页 > 科技  > 软件

Spring事务管理—快速入门

来源: 责编: 时间:2023-10-08 09:59:49 333观看
导读先来讲讲脏读 不可重复读 和 幻读。脏读:我们在并发编程中是很熟悉的,通俗的讲就是你读得数据已经被修改了,已经过时失去意义了。不可重复读: 同一个事务里面多次读取同一行数据,却返回不同的结果。幻读:同样一笔查询在整

biX28资讯网——每日最新资讯28at.com

先来讲讲脏读 不可重复读 和 幻读。biX28资讯网——每日最新资讯28at.com

  • 脏读:我们在并发编程中是很熟悉的,通俗的讲就是你读得数据已经被修改了,已经过时失去意义了。
  • 不可重复读: 同一个事务里面多次读取同一行数据,却返回不同的结果。
  • 幻读:同样一笔查询在整个事务过程中多次执行后,查询所得的结果集不一样。

事务四大特性 ACID

1、原子性(Atomicity)

要求事务所包含的全部操作是一个不可分割的整体,如果有一步发生异常,则全部不提交。biX28资讯网——每日最新资讯28at.com

2、一致性(Consistency)

A给B转钱,A减和B增这两个操作必须保持一致。biX28资讯网——每日最新资讯28at.com

3、隔离性(Isolation)

事务会将一部分数据与其他事务隔离,防止脏读等。biX28资讯网——每日最新资讯28at.com

4、持久性(Durability)

事务的结果被写到持久化存储器中。biX28资讯网——每日最新资讯28at.com

事务四大隔离级别

隔离级别越高,则性能相对越低,反之亦然。biX28资讯网——每日最新资讯28at.com

1、Read Uncommitted

最低的隔离级别,跟你直译的意思一样:可以读取其它事务未完成的结果。(脏读)biX28资讯网——每日最新资讯28at.com

很明显,脏读 不可重复读 和 幻读这三个问题它都有。biX28资讯网——每日最新资讯28at.com

2、Read Committed

大部分数据库采用的默认隔离级别,比上一个隔离级别多了限定:在该事务完成后,才能读取该事务的数据更新后的结果。biX28资讯网——每日最新资讯28at.com

它可以避免脏读,但是也有不可重复读取和幻读的问题。biX28资讯网——每日最新资讯28at.com

3、Repeatable Read

可以保证在整个事务的过程中,对同一笔数据的读取结果是相同的,不管其他事务是否同时在对同一笔数据进行更新,也不管其他事务对同一笔数 据的更新提交与否。biX28资讯网——每日最新资讯28at.com

Repeatable Read隔离级别避免了脏读和不可重复读取的问题,但无法避免幻读。biX28资讯网——每日最新资讯28at.com

4、Serializable

最为严格的隔离级别,所有的事务操作都必须依次顺序执行,可以避免其他隔离级别遇到的所有问题,是最为安全的隔离级别, 但同时也是性能最差的隔离级别。biX28资讯网——每日最新资讯28at.com

通常情况下,我们会使用其他隔离级别加上相应的并发锁的机制来控制对数据的访问,这样既保证 了系统性能不会损失太大,也能够一定程度上保证数据的一致性。biX28资讯网——每日最新资讯28at.com

Spring事务传播机制

事务传播行为biX28资讯网——每日最新资讯28at.com

含义biX28资讯网——每日最新资讯28at.com

PROPAGATION_REQUIRED(默认)biX28资讯网——每日最新资讯28at.com

必须在事务中执行,如果没有,就新new一个新事务biX28资讯网——每日最新资讯28at.com

PROPAGATION_SUPPORTSbiX28资讯网——每日最新资讯28at.com

谁调用我我就在谁的事务中执行,没有的话就没有biX28资讯网——每日最新资讯28at.com

PROPAGATION_MANDATORYbiX28资讯网——每日最新资讯28at.com

必须要有事务,没有就报错biX28资讯网——每日最新资讯28at.com

PROPAGATION_REQUIRED_NEWbiX28资讯网——每日最新资讯28at.com

不管调用我的方法有没有事务,我都new一个事务biX28资讯网——每日最新资讯28at.com

PROPAGATION_NOT_SUPPORTEDbiX28资讯网——每日最新资讯28at.com

调用我的方法有事务,但我不在事务中执行biX28资讯网——每日最新资讯28at.com

PROPAGATION_NEVERbiX28资讯网——每日最新资讯28at.com

不允许在事务中运行,有事务则报错biX28资讯网——每日最新资讯28at.com

PROPAGATION_NESTEDbiX28资讯网——每日最新资讯28at.com

有事务则嵌套,没有则new一个新事务biX28资讯网——每日最新资讯28at.com

从JDBC的事务说起

我们都知道,JDBC给我们提供了事务。biX28资讯网——每日最新资讯28at.com

try{     con.setAutoCommit(false);//开启事务     ......     con.commit();//try的最后提交事务      } catch() {    con.rollback();//回滚事务}

获取事务隔离级别。biX28资讯网——每日最新资讯28at.com

Connection.getTransactionIsolation()

设置事务隔离级别。biX28资讯网——每日最新资讯28at.com

con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

Spring事务机制

Spring并不会直接管理事务,而是提供了事务管理器,将事务管理的职责委托给JPA JDBC JTA DataSourceTransaction JMSTransactionManager 等框架提供的事务来实现。biX28资讯网——每日最新资讯28at.com

那么,Spring提供的事务管理器是什么呢?biX28资讯网——每日最新资讯28at.com


PlatformTransactionManager.java接口:
biX28资讯网——每日最新资讯28at.com

PlatformTransactionManager.java

Spring提供的事务管理器。不同的事务遵循该事务管理器的API,便能很轻松的交给Spring管理。biX28资讯网——每日最新资讯28at.com

public interface PlatformTransactionManager {    // 通过Transation定义 获取Transation    TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;    // 提交事务    void commit(TransactionStatus var1) throws TransactionException;    // 回滚事务    void rollback(TransactionStatus var1) throws TransactionException;}

可以看到它里面引用到了TransactionDefinition和TransactionStatus。biX28资讯网——每日最新资讯28at.com

TransactionDefinition.java

它里面包含了事务的定义。biX28资讯网——每日最新资讯28at.com

public interface TransactionDefinition {    // 传播机制    int PROPAGATION_REQUIRED = 0;    int PROPAGATION_SUPPORTS = 1;    int PROPAGATION_MANDATORY = 2;    int PROPAGATION_REQUIRES_NEW = 3;    int PROPAGATION_NOT_SUPPORTED = 4;    int PROPAGATION_NEVER = 5;    int PROPAGATION_NESTED = 6;    // 隔离级别    int ISOLATION_DEFAULT = -1;    int ISOLATION_READ_UNCOMMITTED = 1;    int ISOLATION_READ_COMMITTED = 2;    int ISOLATION_REPEATABLE_READ = 4;    int ISOLATION_SERIALIZABLE = 8;    int TIMEOUT_DEFAULT = -1;    int getPropagationBehavior();    // 获取隔离级别    int getIsolationLevel();    int getTimeout();        boolean isReadOnly();    @Nullable    String getName();}

TransactionStatus.java

事务的状态。biX28资讯网——每日最新资讯28at.com

public interface TransactionStatus extends SavepointManager, Flushable {    boolean isNewTransaction();    boolean hasSavepoint();    void setRollbackOnly();    boolean isRollbackOnly();    void flush();    boolean isCompleted();}

Spring默认事务使用

1、代码方式使用

@Autowiredprivate PlatformTransactionManager transactionManager;public void testTX(){    DefaultTransactionDefinition definition = new DefaultTransactionDefinition();    TransactionStatus status = transactionManager.getTransaction(definition);    try {        // 业务逻辑        // ...                // 提交事务        transactionManager.commit(status);    }catch (Exception e){        // 发生异常,事务回滚        transactionManager.rollback(status);    }}

2、注解方式使用

@Transactionalvoid testTX2(){    // 业务逻辑 ...}

这不是玄学,它的底层是依靠AOP动态代理实现,其实重新渲染出的代码和第一个使用方式类似,不过大大减少了开发复杂度。biX28资讯网——每日最新资讯28at.com

扩展:@Transactional注解

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface Transactional {    //指定使用的事务管理器    @AliasFor("transactionManager")    String value() default "";    @AliasFor("value")    String transactionManager() default "";    // 可选的事务传播行为设置    Propagation propagation() default Propagation.REQUIRED;    // 可选的事务隔离级别设置    Isolation isolation() default Isolation.DEFAULT;    // 事务超时时间设置    int timeout() default -1;    // 读写或只读事务,默认读写    boolean readOnly() default false;    // 导致事务回滚的异常类数组     Class<? extends Throwable>[] rollbackFor() default {};    // 导致事务回滚的异常类名字数组    String[] rollbackForClassName() default {};    // 不会导致事务回滚的异常类数组    Class<? extends Throwable>[] noRollbackFor() default {};    // 不会导致事务回滚的异常类名字数组    String[] noRollbackForClassName() default {};}

Spring事务实践

非入门选手下面的demo可能会引起你的不适(浪费时间)。
假设我要完成一个功能,当删除用户的时候,将与该用户有关的所有数据行都删除。biX28资讯网——每日最新资讯28at.com

public void delUser(Integer userId) {    // 删除和用户相关的信息     otherRepository.deleteByUserId(userId);     // 删除用户     userRepository.deleteById(userId);}

这样的写法一般来讲,会成功的完成任务。但是如果这样一段代码:biX28资讯网——每日最新资讯28at.com

public void delUser(Integer userId) {    // 删除和用户相关的信息    otherRepository.deleteByUserId();    if (true) {        throw new RuntimeException("xxx");    }    // 删除用户     userRepository.deleteById(userId);}

结果会是:deleteByUserId()执行成功,deleteById()执行失败,不满足数据的一致性。biX28资讯网——每日最新资讯28at.com

所以我们需要事务来限制:要么全部执行,要么全部不执行(方法中有异常就自动回滚)。那怎么实现呢,只需要在方法上加一个注解:@TransactionalbiX28资讯网——每日最新资讯28at.com

@Transactionalpublic void delUser(Integer userId) {    // 删除和用户相关的信息    otherRepository.deleteByUserId();    if (true) {        throw new RuntimeException("xxx");    }    // 删除用户     userRepository.deleteById(userId);}

Spring 加载第三方事务管理

比如我有个需求(接着上次的强票系统II),要求信息不能丢失,要用到RabbitMQ的事务管理,那怎么去加载到Spring的事务管理器中呢?biX28资讯网——每日最新资讯28at.com

@Beanpublic ConnectionFactory connectionFactory() {    CachingConnectionFactory connectionFactory = new CachingConnectionFactory();    return connectionFactory;}@Beanpublic RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory) {    return new RabbitTransactionManager(connectionFactory);}

我们只需要这样做便可以使的使用@Transactional注解来实现对RabbitMQ的事务管理,其它框架也类似。biX28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-12417-0.htmlSpring事务管理—快速入门

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 详解Spring多线程下如何保证事务的一致性

下一篇: HTTP协议揭秘:探寻互联网的背后密码、探秘数据传输的奥秘

标签:
  • 热门焦点
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 机构称Q2国内智能手机销量同比下滑4% vivo份额重回第1

    7月29日消息,根据市场调查机构Counterpoint Research公布的最新报告,2023年第2季度中国智能手机销量同比下降4%,创新自2014年以来第2季度销量新低。报
  • 三星电子Q2营收60万亿韩元 存储业务营收同比仍下滑超过50%

    7月27日消息,据外媒报道,从三星电子所发布的财报来看,他们主要利润来源的存储芯片业务在今年二季度仍不乐观,营收同比仍在大幅下滑,所在的设备解决方案
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

    据10 月 30 日外媒 TheVerge 消息报道,英特尔 Xe HPG Arc Alchemist 的正面实被曝光,不仅拥有 512 EU 版显卡,还拥有 128EU 的单风扇版本。另外,这款显卡 PCB
Top