<!--开启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文档(含详细答案解析)
66个Java面试知识点
架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)
算法刷题(PDF)
库、Redis、设计模式等这些题目都是我刷到过的
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](
)**
并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)
[外链图片转存中…(img-FnowijGG-1631181664064)]
66个Java面试知识点
架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)
[外链图片转存中…(img-ydFA2qGT-1631181664066)]
算法刷题(PDF)