【Spring——事务】

  • 事务作用:在数据层保障一系列的数据库操作同成功同失败。
  • Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败。 
// Spring提供接口-事务平台管理器
public interface PlatformTransactionManager {
    void commit(TransactionStatus status) throws TransactionException;
    void rollback(TransactionStatus status) throws TransactionException;
}
// Spring提供的事务管理器实现类(内部是JDBC事务)
public class DataSourceTransactionManager {
    ...
}

范例:

  • 在业务层接口上添加Spring事务管理 @Transactional

public interface AccountService {
    @Transactional   // 开启Spring事务管理
    public void tranfer(String out ,String in ,Double money);
}

注意事项:Spring注解式事务通常添加在业务层接口中而不会添加到业务层实现类中(降低耦合)

                注解式事务可以添加到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务。

  • 设置平台管理器

public PlatformTransactionManager transactionManager(DataSource dataSource){
    DataSourceTransactionManager ptm = new DataSourceTransactionManager();
    ptm.setDataSource(dataSource);
    return ptm
}
  • 开启注解式事务驱动 @EnableTransactionManagement

@Configuration
@ComponentScan("com.it")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig,class,MybatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {
}

 事务角色:

Spring不是一个数据库技术,那它是怎么控制事务的呢?

  • 事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法。
  • 事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法。

未开启Spring事务之前:

 

  • AccountDao的outMoney因为是修改操作,会开启一个事务T1

  • AccountDao的inMoney因为是修改操作,会开启一个事务T2

  • AccountService的transfer没有事务,

    • 运行过程中如果没有抛出异常,则T1和T2都正常提交,数据正确

    • 如果在两个方法中间抛出异常,T1因为执行成功提交事务,T2因为抛异常不会被执行就会导致数据出现错误

 开启Spring事务管理后:

 

  • transfer上添加了@Transactional注解,在该方法上就会有一个事务T

  • AccountDao的outMoney方法的事务T1加入到transfer的事务T中

  • AccountDao的inMoney方法的事务T2加入到transfer的事务T中

  • 这样就保证他们在同一个事务中,当业务层中出现异常,整个事务就会回滚,保证数据的准确性。

事务相关配置: 

属性作用示例
readOnly设置是否为只读事务readOnly = true    (只读事务)
timeout设置事务超时时间timeout = -1      (永不超时)
rollbackFor设置事务回滚异常(class)rollbackFor = {IOException.class} (遇到该异常,进行回滚)
rollbackForClassName设置事务回滚异常(String)同上格式为字符串
noRollbackFor设置事务不回滚异常(class)noRollbackFor = {NullPointException.class}
noRollbackForClassName设置事务不回滚异常(String)同上格式为字符串
propagation设置事务传播行为
public interface AccountService {
    @Transactional(readOnly = true,timeout = -1)
    public void tranfer(String out ,String in ,Double money);
}

 事务传播行为:

传播属性事务管理员事务协调员
REQUIRED(默认)开启T(事务)加入T
新建T2
REQUIRES_NEW开启T新建T2
新建T2
SUPPORTS开启T加入T
NOT_SUPPORTED

开启T

MANDATORY开启T加入T
ERROR
NEVER开启TERROR
NESTED设置savePoint,一旦事务回滚,事务将回滚到savePoint处,交由客户响应提交/回滚

说明:若传播属性为默认,事务管理员开启事务,事务协调员则加入;若事务管理员没有开启事务,事务协调员则新建事务。

public interface LogService {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void log(String out ,String in ,Double money);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值