SpringBoot之事务管理@Transactional

本文介绍了一个使用Spring Boot实现转账功能的例子,演示了如何通过@Service注解配合@Transactional来管理事务,确保转账过程的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作;

用来保证一致性,即service方法里的多个dao操作,要么同时成功,要么同时失败;

springboot下的话 搞一个@Transactional即可

转账实例,A用户转账给B用户xx元

Account类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package  com.huawei.entity;
 
import  javax.persistence.Column;
import  javax.persistence.Entity;
import  javax.persistence.GeneratedValue;
import  javax.persistence.Id;
import  javax.persistence.Table;
 
@Entity
@Table (name= "t_account" )
public  class  Account {
 
     @Id
     @GeneratedValue
     private  Integer id;
     
     @Column (length= 50 )
     private  String userName;
     
     private  float  balance;
 
     public  Integer getId() {
         return  id;
     }
 
     public  void  setId(Integer 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;
     }
 
     
     
     
}

id 编号 userName用户名 balance余额


运行启动类,数据库里我们加两个数据

QQ鎴浘20170808160943.jpg


新建AccountDao接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package  com.huawei.dao;
 
import  org.springframework.data.jpa.repository.JpaRepository;
 
import  com.java1234.entity.Account;
 
/**
  * 账户Dao接口
  * @author user
  *
  */
public  interface  AccountDao  extends  JpaRepository<Account, Integer>{
 
}


AccountService接口

1
2
3
4
5
6
7
8
9
10
11
12
package  com.huawei.service;
 
/**
  * 帐号Service接口
  * @author user
  *
  */
public  interface  AccountService {
 
     public  void  transferAccounts( int  fromUser, int  toUser, float  account);
 
}


AccountServiceImpl接口实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package  com.huawei.service.impl;
 
import  javax.annotation.Resource;
import  javax.transaction.Transactional;
 
import  org.springframework.stereotype.Service;
 
import  com.huawei.dao.AccountDao;
import  com.huawei.entity.Account;
import  com.huawei.service.AccountService;
 
/**
  * 帐号Service实现类
  * @author user
  *
  */
@Service ( "accountService" )
public  class  AccountServiceImpl  implements  AccountService{
 
     @Resource
     private  AccountDao accountDao;

     @Transactional
    //事物处理
     public  void  transferAccounts( int  fromUserId,  int  toUserId,  float  account) {
         Account fromUserAccount=accountDao.getOne(fromUserId);
         fromUserAccount.setBalance(fromUserAccount.getBalance()-account);
         accountDao.save(fromUserAccount);  // fromUser扣钱
         
         Account toUserAccount=accountDao.getOne(toUserId);
         toUserAccount.setBalance(toUserAccount.getBalance()+account);
         accountDao.save(toUserAccount);  // toUser加钱
     }
     
     
}


AccountController类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package  com.huawei.controller;
 
import  javax.annotation.Resource;
 
import  org.springframework.web.bind.annotation.RequestMapping;
import  org.springframework.web.bind.annotation.RestController;
 
import  com.huawei.service.AccountService;
 
/**
  * 账户Controoler类
  * @author user
  *
  */
@RestController
@RequestMapping ( "/account" )
public  class  AccountController {
 
     @Resource
     private  AccountService accountService;
     
     @RequestMapping ( "/transfer" )
     public  String transferAccounts(){
         try {
             accountService.transferAccounts( 1 2 200 );
             return  "ok" ;
         } catch (Exception e){
             return  "no" ;
         }
     }
}


我们执行启动类

浏览器输入:http://localhost:8888/account/transfer

OK 我们先把数据恢复到700  300


`@Transactional` 是Spring框架提供的一个用于声明式事务管理的注解。它允许开发者通过简单地在方法上或类上添加该注解来声明事务边界,而不需要编写事务管理的代码。使用`@Transactional`注解,Spring容器会根据配置创建一个代理,这个代理会拦截带有`@Transactional`注解的方法调用,并在运行时进行事务管理。 `@Transactional`注解的基本使用方法如下: 1. **在方法上使用:** 当你在方法上使用`@Transactional`注解时,Spring会在该方法开始执行时开启一个事务,并在方法执行完毕后,根据方法的执行结果决定是提交事务还是回滚事务。 2. **在类上使用:** 当你在类上使用`@Transactional`注解时,Spring会对类中的所有公共方法应用事务管理。如果类中的某些方法不应该使用事务或者需要不同的事务管理策略,可以在这些方法上单独使用`@Transactional`注解并指定不同的属性。 `@Transactional`注解的常用属性包括: - `value` 或 `transactionManager`:指定事务管理器的名称。 - `propagation`:指定事务的传播行为,例如`Propagation.REQUIRED`、`Propagation.REQUIRES_NEW`等。 - `isolation`:指定事务的隔离级别,例如`Isolation.DEFAULT`、`Isolation.READ_COMMITTED`等。 - `timeout`:指定事务的超时时间。 - `readonly`:指定事务是否只读,默认为false。 使用示例: ```java @Service public class MyService { @Transactional public void doSomething() { // 业务逻辑 } @Transactional(propagation = Propagation.REQUIRES_NEW) public void doSomethingElse() { // 另一个业务逻辑,需要新的事务 } } ``` 在上述代码中,`doSomething`方法和`doSomethingElse`方法都被`@Transactional`注解修饰,意味着它们的操作会发生在事务上下文中。其中`doSomethingElse`方法因为指定了`propagation = Propagation.REQUIRES_NEW`,所以在调用时会开启一个新的事务,即使当前已经有事务存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值