企业级spring学习日记(三)

Spring事务简介

  • 事务作用:在数据层保障一系列的数据库操作同成功同失败
  • Spring事务作用:在数据层或业务层保证一系列的数据库操作同成功同失败
public interface PlatformTransactionManager{
	void commit(TransactionStatus status) throws TransactionException;
	void rollback(TransactionStatus status) throws TransactionException;
}
public class DataSourceTransactionManager{
	......
}

案例:银行转账操作
A向B转账100,数据库中A的金额数减少,B的金额数增加
①:在业务层接口上添加Spring事务管理

public interface AccountService{
	@Transactional
	public void transfer(String out,String in,Double money);
}

注意:Spring注解式事务通常添加在业务层接口中而不会添加到业务层实现类中,降低耦合
           注解式事务可以天交到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务
②:设置事务管理器

@Bean
public PlatfromTransactionManager transactionManager(DataSource dataSource){
	DataSourceTransacionManager ptm = new DataSourceTransactionManager();
	ptm.setDataSource(dataSource);
	return ptm;
}

③:开启注解式事务驱动

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

Spring事务角色

如果没用@Transactional开启Spring事务,那么outMoney和inMoney就是两个单独的事务,各干各的不影响,开启事务T之后,T1和T2会加入到事务T,整个流程只有一个事务了,所以一旦有异常就可以进行回滚,做到同成功同失败的操作,开启事务的角色称为事务管理员,加入的为事务协调员

  • 事务管理员:发起事务方,在Spring中通常指业务层开启事务的方法
  • 事务协调员:计入事务方,在Spring中通常指数据层或者业务层方法
@Transactional			//开启事务T
public void transfer(String out,String in,Double money){
	accountDao.outMoney(out,money);
	accountDao.outMoney(out,money);
}
public interface AccountDao{
	@Update("update tbl_account set money = money - #{money} where name = #{name}")
	//事务T1
	void outMoney (@Param("name") String name,@Param("money") Double money);
	//事务T2
	void inMoney(@Pram("name") String name,@Param("money") Double money)
}

Spring事务属性

属性作用实例
readOnly设置是否为只读readOnly = true 只读事务
timeout设置事务超过时间timeout = -1 永不超时
roolbackFor设置事务回滚异常(class)rollbackFor={NullPointException.class}
roobackForClassName设置事务回滚异常(String)同上,格式为字符串
noRollbackFor设置事务不回滚异常(class)noRollbackFor={Null.PointException.class}
noRollbackForClassName设置事务不回滚异常(String)同上格式为字符串
propagation设置事务传播行为

案例:转账业务追加日志
任意两个账户转账,每次转账操作无论成功必须在数据库留痕+
①:在业务层接口上添加Spring事务,设置事务传播行为REQUIRES_NEW(需要新事物)

@Service
public class LogServiceImpl implements LogService{
	@Autowired
	private LogDao logDao;
	@Transactional(propagetion = Propagetion.REQUIRES_NEW)
	public void log(String out,String in,Double money) {
		logDao.log("转账操作由"+out"到"+in,"金额:"+money)
	}
}

事务传播行为
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值