Spring--声明式事务控制,从基础到深入案例

<!--开启spring对注解事务的支持-->

<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>



要想进行事务控制,我们应该在在业务层去实现,接下来配置账户的业务层



/**

  • @Author: Ly

  • @Date: 2020-08-05 18:57

  • 账户的业务层接口

*/

public interface IAccountService {

/**

 * 转账

 * @param sourceName  转成账户名称

 * @param targetName  转入账户名称

 * @param money       转账金额

 */

void transfer(String sourceName, String targetName, Float money);

}

/**

  • @Author: Ly

  • @Date: 2020-08-05 19:00

  • 账户的业务层实现类

*/

@Service(“accountService”)

@Transactional(propagation = Propagation.SUPPORTS,readOnly = true)//只读型事务配置

public class AccountServiceImpl implements IAccountService {

@Autowired

private IAccountDao accountDao;



//读写型事务配置

@Transactional(propagation = Propagation.SUPPORTS,readOnly = false)

public void transfer(String sourceName, String targetName, Float money) {



    System.out.println("transfer");

    //2.1.根据名称查询转出账户

    Account source=accountDao.findAccountByName(sourceName);

    //2.2.根据名称查询转入账户

    Account target=accountDao.findAccountByName(targetName);

    //2.3.转出账户减钱

    source.setMoney(source.getMoney()-money);

    //int i=1/0;

    //2.4.转给账户加钱

    target.setMoney(target.getMoney()+money);

    //2.5.更新装出账户

    accountDao.updateAccount(source);

    //2.6.更新转入账户

    accountDao.updateAccount(target);

}

}




配置账户的持久层:



/**

  • @Author: Ly

  • @Date: 2020-08-05 12:17

*/

public interface IAccountDao {

/**

 * 根据名称查询账户

 * @param accountName

 * @return

 */

Account findAccountByName(String accountName);



/**

 * 更新账户

 * @param account

 */

void updateAccount(Account account);

}

/**

  • @Author: Ly

  • @Date: 2020-08-05 12:20

*/

@Repository(“accountDao”)

public class AccountDaoImpl implements IAccountDao {

@Autowired

private JdbcTemplate jdbcTemplate;



public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

    this.jdbcTemplate = jdbcTemplate;

}



public Account findAccountByName(String accountName) {

    List<Account> accounts =jdbcTemplate.query("select * from account where name= ?",new BeanPropertyRowMapper<Account>(Account.class),accountName);

    if(accounts.isEmpty()){

        return null;

    }

    if(accounts.size()>1){

        throw new RuntimeException("结果集不唯一");

    }

    return accounts.get(0);

}



public void updateAccount(Account account) {

    jdbcTemplate.update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());

}

}




测试代码:



/**

  • @Author: Ly

  • @Date: 2020-07-27 17:17

*/

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = “classpath:bean.xml”)

public class AccountServiceTest {

@Autowired

private IAccountService as;



@Test

public void testTransfer(){

    as.transfer("aaa","bbb",100f);

}

}




基于XML的声明式事务控制我们只需要修改bean.xml配置文件即可:  

**配置步骤:**



*   1、配置事务管理器

*   2、配置事务的通知:导入事务的约束,使用tx:advice标签配置事务通知  

    属性:id:给事务通知起一个唯一标识  

    transaction-manager:给事务通知提供一个事务管理器引用

*   3、配置AOP中的通用切入点表达式

*   4、建立事务通知和切入点表达式的对应关系

*   5、在tx:advice标签的内部配置事务的属性



> 配置事务的属性:  

> isolation:用于指定事务的隔离级别。默认执行default:表示使用数据库的默认隔离级别  

> propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择SUPPORTS。  

> read-only:用于指定事务是否只读只有查询方法才能设置为true。默认值为false,表示读写  

> timeout:用于指定事务的超时时间。默认值为-1,表示永不超时。如果指定了数值,以秒为单位  

> rollback-for:用于指定一个异常,但产生该异常时,事务回滚。产生其他异常时,事务不回滚。没有默认值,表示任意异常都回滚  

> no-rollback-for:用于指定一个异常,但产生该异常时,事务不回滚。产生其他异常时,事务回滚。没有默认值,表示任意异常都回滚



<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns=“http://www.springframework.org/schema/beans”

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xmlns:aop="http://www.springframework.org/schema/aop"

   xmlns:tx="http://www.springframework.org/schema/tx"

   xsi:schemaLocation="http://www.springframework.org/schema/beans

   http://www.springframework.org/schema/beans/spring-beans.xsd

   http://www.springframework.org/schema/aop

总结

谈到面试,其实说白了就是刷题刷题刷题,天天作死的刷。。。。。

为了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](

)**

并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)

我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...

66个Java面试知识点

架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)

我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...

算法刷题(PDF)

库、Redis、设计模式等这些题目都是我刷到过的

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](

)**

并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)

[外链图片转存中…(img-FnowijGG-1631181664064)]

66个Java面试知识点

架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)

[外链图片转存中…(img-ydFA2qGT-1631181664066)]

算法刷题(PDF)

我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值