事务管理代码嵌入嵌入到业务代码中,来控制事务的提交和回滚,例如TransactionManager
使用aop对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据执行的情况提交或者回滚
Spring事务传播行为是Spring框架中的一种事务管理方式
当事务方法被另外一个事务方法调用时,必须指定事务应该如何传播
1.PROPAGATION_REQUIRED(默认)
如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务
2.PROPAGATION_REQUIRES_NEW
创建一个新的事务,如果当前存在事务,则把当前事务挂起
3.PROPAGATION_NESTED
如果当前存在事务,就在当前事务内执行;否则,就执行与 PROPAGATION_REQUIRED 类似的操作
4.PROPAGATION_SUPPORTS
如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行
5.PROPAGATION_NOT_SUPPORTED
以非事务方式运行,如果当前存在事务,则把当前事务挂起
6.PROPAGATION_MANDATORY
如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常
7.PROPAGATION_NEVER
以非事务方式运行,如果当前存在事务,则抛出异常
Spring的事务隔离级别是用于控制事务并发访问数据库时的行为
ISOLATION_DEFAULT,使用数据库默认的隔离级别,MySql 默认采用的是 REPEATABLE_READ,也就是可重复读。
ISOLATION_READ_UNCOMMITTED(读未提交),最低的隔离级别,可能会出现脏读、幻读或者不可重复读。
ISOLATION_READ_COMMITTED(读已提交),允许读取并发事务提交的数据,可以防止脏读,但幻读和不可重复读仍然有可能发生。
ISOLATION_REPEATABLE_READ(可重复读),对同一字段的多次读取结果都是一致的,除非数据是被自身事务所修改的,可以阻止脏读和不可重复读,但幻读仍有可能发生。
ISOLATION_SERIALIZABLE(序列化),最高的隔离级别,虽然可以阻止脏读、幻读和不可重复读,但会严重影响程序性能
1. 脏读
读了未提交的的数据 例如:T1、T2俩事务,T1读了T2,T2回滚
2. 不可重复读
读了修改前后的数据
3. 幻读
读了插入或删除前后的数据
原子性 (atomicity):强调事务的不可分割.
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
一致性 (consistency):事务的执行的前后数据的完整性保持一致.
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数
据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的
状态,或者说是 不一致的状态。
隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
持续性 (durability) :事务一旦结束,数据就持久到数据库
事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
作用于非public方法上
数据库不支持事务
同个类中的调用被@transaction修饰的方法,会失效,因为只有当事务方法被当前类以外的代码调用,才会由spring生成的代理对象来管理
未背Spring进行管理
方法被final修饰,代理类中,就无法重写该方法,添加事务功能
一个事务所允许执行的最长时间,如果在超时时间内还没有完成的话,就自动回滚