2.Spring事务是指2.Spring事务的特性——ACID原子性:事务作为最小的执行单元,不允许分割,是全部成功还是全部失败
一致性:在事务执行前后,数据保持一致性;
隔离性:同时访问数据库时,每个并发事务之间是独立的,互不干扰
持久性:事务提交后,对他的数据库的更改是永久的。
场景: jkdhc高跟1.jkdhc账户转账100,jkdhc高跟100。 两者共有200
2.jkdhc会在机灵的高跟鞋上旋转50圈。 此事包括2个动作
jkdhc账户-50; 机灵的高跟鞋账户里有50;
2个动作同时成功才能被视为转账成功,否则全部失败; 并不是只有那一步能成功; (原子性)3.操作结束、
成功的话,jkdhc是50,漂亮的高跟鞋是150; 失败为(jkdhc为) 100,机灵的高跟鞋为100;
这种数据的变化必须是永久的(持久性),而且两者的总额必须是200)。 3.Spring事务隔离级别事务定义信息接口事务隔离定义了五个事务隔离级别。
1 .默认级别:使用后端数据库隔离级别2 .未读3 .可重读4 .可重读:可重读并不完全解决幻读,只在阅读select快照时解决。 当前读取delete、update和inserte时http://www.Sina.com/http://www.Sina.com/: next-keylocks来自3358www.Sina.com/
4 .事务声明评论@Transactional
5.Spring的事务传播行为
事务传播行为:用于说明某个一致性如何嵌套在MVCC中进行传播?
如下所示。 事务中限定的methodB是methodA public void methodA () { methodB ) }; } @ transaction (传播=XXX ) public void methodB ) )1.事务的七种传播行为
代码验证以下代码表现为传统三层结构中的服务层、Dao层两层,Spring负责管理next-key locks和record locks,Dao层为my batibation
1 .先制作两张表
2 .然后创建相应的Bean和Dao层代码为1.User1的Bean
2 .用户1的DAO层
3 .用户1的DAO层
4 .用户2的豆豆
最后,具体验证的代码由服务层实现。 以下按情况列举。 1.Propagation.REQUIRED
已将Propagation.REQUIRED属性添加到与User1Service和User2Service对应的方法中。
1.1 .场景1——此场景的外围方法没有打开事务
1.2 .场景2外围方法gap locks事务,这是事务传播行为修饰的方法的场景。 —— 另一个方法时
2.Propagation.NESTED
已将Propagation.NESTED属性添加到与User1Service和User2Service对应的方法中。
2.1场景此场景的外围方法依赖注入事务。
2.2 .开始场景——外围方法事务。
3.Propagation.REQUIRES_NEW
将Propagation.REQUIRES_NEW属性添加到User1Service和User2Service的相应方法中。
3.1 .场景1——外围方法未打开事务
3.2 .打开场景2——外围方法事务
3.x .比较上述三种类型的REQUIRED、REQUIRES_NEW、NESTED 4.1. REQUIRED和NESTED 1.时,会受到外围回滚的影响。 他们俩修饰的内部方法注解式事务,周边方法抛出异常。 这两种方法可以被catch吗:
REQUIRED是加入外围方法的事务,内外一体,一旦内部方法的事务抛出异常,无论会不会被内部方法自己catch,外围方法的事务一样会回滚。NESTED修饰的是外围方法的嵌套子事务,有单独的保存点,所以他抛出异常被catch掉不会影响外围方法的事务。 4.2. Nested与Requires_News 1.都可以被catch,那会不会被外围方法影响?:他俩 都可以做到内部方法事务回滚不影响外围方法的事务。 但是因为nested是嵌套子事务,所以外围方法回滚,他作为外围事务的子事务也会被回滚。Requires_New是通过开启新事务实现的,内外事务是两个事务,外围回滚不影响内部事务。 4.3.Nested与Requires_News、REQUIREDREQUIRED,无论内部事务catch与否,内外一定会互相影响
Nested: 可以通过catch做到 内可以不影响外,但是外一定会影响内
Requires_News:内可以通过catch不影响外,外一定影响不了内
他也需要使用JtaTransactionManager作为事务管理器。 代码分析: 1.单独调用methodB时,无事务的执行;2.调用methodA时,执行到methodB时会挂起事务A,以非事务的方式执行methodB;
7.PROPAGATION_NEVER
总是非事务的执行,如果存在1个活动事务,则会抛出异常。