传播属性:
propagation_required 如何当前没有发生事物,就新建一个事物。如果已经攒在一个事物,加入到这个事务中。
propagation_supports 支持当前事物,如果当前没有食物,就以非实物方式执行
propagation_mandatory 使用当前的事物,如果当前没有事物,就抛出异常
propagation_requires_new 新建事物,如果当前存在事物,就把当前事物挂起
propagation_not_supported 以非事物方式执行操作,如果当前存在事物,就把当前事务挂起
propagation_never 以非事物方式执行,如果当前存在事物,则抛出异常
propagation_nested 如果当前存在事物,则在嵌套事务内执行。如果当前没有事物,则执行与propagation_required类似的操作
隔离级别:
isolation_default
isolation_read_committed不允许脏读,非重复读和幻想度允许
isolation_read_uncommitted脏读,非重复读,幻想度都允许
isolation_repeatable_read不允许脏读和非重复读,幻想读允许
isolation_serializable脏读,非重复读,幻想度都不允许
脏读:
| T1 | 开始事务 | |
| T2 | 开始事务 | |
| T3 | 查询账户余额为1000元 | |
| T4 | 取出五百元,把余额改为五百 | |
| T5 | 查询账余额为伍佰元 | |
| T6 | 撤销事务余额恢复一千元 | |
| T7 | 汇入一百元余额改为六百元 | |
| T8 | 提交事务 |
不可重复读(读到了其他提交事务的修改或删除数据)
| T1 | 开始事务 | |
| T2 | 开始事务 | |
| 查询账户余额为一千元 | ||
| T3 | 查询账户余额为一千元 | |
| T4 | 存入一百元 | |
| T5 | 提交事务 | |
| T6 | 再次统计总储蓄额为一千一百元 |
幻想读(读到了其他已提交事务的新增数据)
| T1 | 开始事务 | |
| T2 | 开始事务 | |
| T3 | 统计总储蓄额为一千元 | |
| T4 | 新增加一个存款用户,存款为一百元 | |
| T5 | 提交事务 | |
| T6 | 再次统计总储蓄额为一千一百元 |
第一类丢失更新
| T1 | 开始事物 | |
| T2 | 开始事物 | |
| T3 | 查询账户余额为一千元 | |
| T4 | 查询账户余额为一千元 | |
| T5 | 汇入一百元把余额改为一千一百元 | |
| T6 | 提交事务 | |
| T7 | 取出一百元把余额改为九百元 | |
| T8 | 撤销事务 | |
| T9 | 把余额改为一千元(丢失更新) |
第二类丢失更新
| T1 | 开始事物 | |
| T2 | 开始事物 | |
| T3 | 查询账户余额为一千元 | |
| T4 | 查询账户余额为一千元 | |
| T5 | 汇入一百元把余额改为一千一百元 | |
| T6 | 提交事务 | |
| T7 | 取出一百元把余额改为九百元 | |
| T8 | 提交事务 | |
| T9 | 把余额改为一千元(丢失更新) |
本文详细解析了事务的传播属性及其应用场景,包括REQUIRED、SUPPORTS、MANDATORY等,并深入探讨了不同的隔离级别,如READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE等对脏读、不可重复读及幻读的影响。
1047

被折叠的 条评论
为什么被折叠?



