春季交易知识点(总结)
什么是交易?
答:这种一次操作数据库的操作被认为是一个事务,这种行为是抽象的。
例如,一次查询用户表的所有内容称为事务。
交易的四大特征(ACID):
?原子性:事务中的操作要么全部成功执行,要么全部不成功。
?一致性:事务执行后,数据库状态与其他业务规则一致。例如,在转账业务的情况下,无论交易是否成功执行,参与转账的两个账户的余额总和都应保持不变。
?隔离:每个事务独立运行。在并发环境中,并发事务相互隔离,互不影响。
?持久性:一旦提交事务,数据库中的数据必须永久保存。
事务的4个隔离级别:
通过传输系统进行分析:
读取_未提交
读取但未提交,即一个事务从另一个事务中读取未提交的数据。在此隔离级别,将发生“脏读”。下表
交易保证金
交易提取
交易开始。
-
-
交易开始
-
b .查询交易余额(10元)
-
b拆除10元(0元)。
一次查询交易余额(0元)。
-
-
取消(10元)
一笔交易保证金在10元(10元)。
-
交易提交(更新余额:10元)。
-
正常情况下,交易A和B执行后,账户余额应该是20元,但在T5时刻,交易A查询的余额是0元,因为读取了交易B的未提交数据,也就是读取了“脏”数据。
READ _ COMMITTED
在这种隔离级别下,可以有效避免“脏读”。虽然解决了不可重复读取的问题,但在这种隔离级别下无法避免。在READ_COMMITTED隔离级别下,可能会出现表13-2所示的场景。下表
处理查询
交易提取
交易开始。
-
-
交易开始
-
b .查询交易余额(10元)
一次交易询价(10元)
ext-align: center">----
事务A执行了两次余额查询,但第一次查询得到的余额是10元,第二次查询得到的余额为0元,这就是不可重复读取的问题。
REPEATABLE_READ
可重复读级别是保证在事务处理过程中多次读取同一个数据时的值始终是一致的。可重复读取是通过在事务开启后不允许其他事务对当前记录进行修改操作实现的。
这个隔离级别避免了“脏读”和不可重复读的问题,但是有可能会出现“幻读”。“幻读”场景的出现。如下表
事务A查询 | 事务B存款款 |
---|---|
事务A开始 | ---- |
---- | 事务B开始 |
事务A查询 | ---- |
---- | 事务B存入10元 |
---- | 事务B提交 |
事务A查询 | ---- |
事务A提交 | ---- |
在事务A中,同一个事务多次获取交易记录,发现第二次获取交易记录的结果中多出了一笔存款记录——事务B发生的存款操作,对事务A来说,好像是出现了幻觉一样,即“幻读”。
SERIALIZABLE
顺序读是最严格的事务隔离级别。它要求所有的事务排队依序执行,即事务只能一个接一个地处理,不能并发执行。
Spring还有一种默认既是根据数据的事务来决定自己的事务
4种事务隔离级别从上往下,级别越高,并发性越差,但安全性越来越高。
事务隔离级别 | 脏读 | 重复读 | 幻读 |
---|---|---|---|
READ_UNCOMMITTED | 允许 | 允许 | 允许 |
READ_COMMITTED | 不允许 | 允许 | 允许 |
REPEATABLE_READ | 不允许 | 不允许 | 允许 |
SERIALIZABLE | 不允许 | 不允许 | 不允许 |
事务的7中传播途径
答:事务传播行为是用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时候。
举例子:
-
首先查询剩余余额算成一个事务
-
接着定义取款事务
取款之前先调用查询事务
这个过程就叫事务的传播
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/52957.html