什么是事务

154 阅读3分钟

大致上我们可以从两个维度来了解事务

特性:ACID

  • Atomicity:一个事务就是一个不可分割的最小工作单元,整个事务的所有操作要么全部成功,要么全部失败。
  • Consistency:数据库总是需要从一个一致性的状态转换到另一个一致性的状态,假如唯一性被违反,那么就必须撤销事务,返回最初状态
  • Isolation:每个读写事务对其他事务的操作对象能相互分离,如果一个事务要访问的数据正在被另一个事务修改,只要另一个事务没有提交,它所访问的数据就不受未提交事务的影响。打个比方,Tom 给 Jerry 转账 100如果这个交易未完成,那么Jerry是看不到这新增的100 如果这个交易未完成,那么 Jerry 是看不到这新增的 100 的。
  • Durability:事务只要提交了,那么其做的修改就会永久保存到数据库。

属性:

  • 事务名称:用户可手动制定事务的名称,当多个事务的时候,就可以进行区分使用。
  • 隔离级别:为了解决数据库容易出现的问题,用分级加锁的处理策略。(isolation)
  • 超时时间:定义了一个事务执行过程多久算超时,超时后就进行数据回滚。防止长期运行的事务占用资源。(timeout)
  • 是否只读:表示本事务只读数据,不更新数据。通过这样的显示声明可以帮助数据库引擎优化事务。(readOnly)
  • 传播机制:定义了事务的传播性,有 7 种类型。 (propagation)
  • 回滚机制:定义了遇到异常时的回滚策略。

属性和特性的关系是,通过这6个属性来保证这4个特性。

隔离级别

在事务的处理过程中,如下三个问题是绕不开,事务也是围绕着其的解决方案。

Dirty Read:

事务 A 在修改后,还未提交修改时,事务 B 查询了 A 未提交前的记录,这是 Dirty Read。

Non-repeatable read:

事务 A 读取了一次后,事务 B 对数据进行修改并提交了事务后,事务 A 再查询时,发现数据却不一致,这是 Non-repeatable read。

Phantom Read:

事务 A 读取了一次,此时 B 插入一条数据事务 A 再次查询,记录多了。

Non-repeatable read 和 Phantom Read 这两种,从结果来看,两者很相似,但是从控制的方面来看,就看出区别了。Non-repeatable read 重点在于 update 和 delete,Phantom Read 的重点在于 insert。对应办法为,Non-repeatable read 为其添加行级锁,Phantom Read 为其添加表级锁。

四种隔离级别:

Read Uncommitted:可能读取其他事务未提交的数据。

Read Committed:一个事务只能看见已经提交事务所做的改变。

Repeatable Read:一个事务在开始后,其他事务就不能对数据进行修改了。

Serializable:在每一个读的数据行上加上共享锁,事务顺序执行。

(之后具体的再详细深入)

最后补充一点 Spring 中的注解属性:

@Transactional 注解的全部属性如下图

图片.png