传播属性:
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 | 把余额改为一千元(丢失更新) |