一.
在银行转账时如果发生异常可能导致A金钱转出,而B未收到钱的问题,此时需要引入事务管理。
先写一个Bank类:
package com.example.test;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="bank")
public class Bank {
@Id
@GeneratedValue
private int id;
@Column(length=50)
private String username;
private float balance;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public float getBalance() {
return balance;
}
public void setBalance(float balance) {
this.balance = balance;
}
}
然后写一个BankDao接口(使用jpa):
package com.example.test;
import org.springframework.data.jpa.repository.JpaRepository;
public interface BankDao extends JpaRepository<Bank, Integer>{
}
写服务层BankService和BankServiceImpl:
package com.example.service;
public interface BankService {
public void transferAccount(int idA,int idB,float account);
}
package com.example.service;
import javax.annotation.Resource;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import com.example.test.Bank;
import com.example.test.BankDao;
@Service("accountservice")
public class BankServiceImpl implements BankService{
@Resource
private BankDao bankDao;
@Transactional
public void transferAccount(int idA, int idB, float account) {
Bank A =bankDao.getOne(idA);
A.setBalance(A.getBalance()-account);//用户A扣钱
bankDao.save(A);
Bank B =bankDao.getOne(idB);
B.setBalance(B.getBalance()+account);//用户B加钱
bankDao.save(B);
}
}
最后写一个控制类BankController:
package com.example.test;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.service.BankService;
@RestController
@RequestMapping("/bank")
public class BankController {
@Resource
private BankService bankService;
@RequestMapping("/transfer")
public String transfer() {
try {
bankService.transferAccount(1, 2, 50);
return "OK";
}catch(Exception e) {
return "ERROR";
}
}
}
二.打开网页,测试:
http://localhost:8888/bank/transfer
(我的application设置了端口为:8888)
看到即成功:
同时mysql中可以看到金钱的变化:
为了看到@Transactionnal的效果可以在BankServiceImpl的方法中故意引入异常进行测试。