SpringBoot之@Transactional事務管理簡介
阿新 • • 發佈:2018-12-17
一.
在銀行轉賬時如果發生異常可能導致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的方法中故意引入異常進行測試。