什么是事务 In 战利商城 @2026-02-05 08:54:30
大致上我们可以从两个维度来了解事务
**特性:ACID**Atomicity:一个事务就是一个不可分割的最小工作单元,整个事务的所有操作要么全部成功,要么全部失败。Consistency:数据库总是需要从一个一致性的状态转换到另一个一致性的状态,假如唯一性被违反,那么就必须撤销事务,返回最初状态Isolation:每个读写事务对其他事务的操作对象能相互分离,如果一个事务要访问的数据正在被另一个事务修改,只要另一个事务没有提交,它所访问的数据就不受未提交事务的影响。打个比方,Tom 给 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 注解的全部属性如下图**
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!