事务

1.什么是事务

百度百科解释道:一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。

也就是说,对数据库数据造成修改(更新)的一个执行单元。

1.1事务的特性(ACID)

  • 原子性(Atomicity)

事务中的操作,要不全部执行,要不全不执行

  • 一致性(Consistency)

事务执行的结果必须是使数据库从一个一致性状态转变到另一个一致性状态,因此当数据库只包含成功事务提交 的结果时,就能说数据库处于一致性状态。而如果数据库系统在运行过程中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。

  • 隔离性(Isolation)

事务的隔离性是指在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其他事务干扰。也就是说,不同的事务并发操纵相同的数据时,每个事务都有各自完整的数据空间,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

  • 持久性(Durability)

事务的持久性也被称为永久性,是指一个事务一旦提交,它对数据库中对应数据的状态变更就应该是永久性的。换句话说,一旦某个事务成功结束,那么它对数据库所做的更新就必须被永久保存下来——即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束时的状态。

1.2事务的隔离级别

  • 读未提交(Read uncommitted)

    • 就是一个事务可以读取另一个未提交事务的数据。(允许脏读

    脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

    当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。

    • 解决方法 Read committed
  • 读提交(Read committed)(Oracle默认)

    • 一个事务要等另一个事务提交后才能读取数据。
    • 若有事务对数据进行更新操作时,读操作事务等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但是,这样就会出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。

    不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。(读取了前一个已提交的事务)

    • 解决不可重复读方法 Repeatable read
  • 重复读(Repeatable read)(MySQL默认)

    • 在开始读取数据(事务开启)时,不再允许修改操作。但是还有可能发生幻读(添加操作)

    幻读
    B事务读取了两次数据,在这两次的读取过程中A事务添加了数据,B事务的这两次读取出来的集合不一样。

    • 解决幻读的方法 Serializable
  • 序列化(Serializable)

    • Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

2.什么是分布式事务(2种)

在分布式系统中一次操作由多个系统协同完成,这种一次事务操作涉及多个系统通过网络协同完成的过程称为分布式事务。这里强调的是多个系统通过网络协同完成一个事务的过程,并不强调多个系统访问了不同的数据库,即使多个系统访问的是同一个数据库也是分布式事务
在这里插入图片描述

另外一种分布式事务的表现是,一个应用程序使用了多个数据源连接了不同的数据库,当一次事务需要操作多个数据源,此时也属于分布式事务,当系统作了数据库拆分后会出现此种情况。

在这里插入图片描述

3.事务的传播行为

3.1传播行为介绍

事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。

举例 :
我们的数据代码一般都写在service(实现类)里,倘若,你service中的方法A,调用了service(同一个类)中的方法B

3.2传播机制

七个传播机制:(@Transactional (propagation = xxx))

  • PROPAGATION_REQUIRED-支持当前事务;如果不存在,创建一个新的(默认)。
  • PROPAGATION_SUPPORTS-支持当前事务;如果当前事务不存在,按非事务执行。
  • PROPAGATION_MANDATORY-支持当前事务;如果没有当前事务,则抛出异常的存在。
  • PROPAGATION_REQUIRES_NEW-创建一个新事务,如果当前事务存在,则挂起当前事务。
  • PROPAGATION_NOT_SUPPORTED-不支持当前事务;而是始终以非事务方式执行。
  • PROPAGATION_NEVER-不支持当前事务;如果当前事务引发异常的存在。
  • PROPAGATION_NESTED-如果当前事务存在,则在嵌套事务中执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值