1. 程式人生 > 實用技巧 >Solution -「AGC 010C」「AT 2304」Cleaning

Solution -「AGC 010C」「AT 2304」Cleaning

Spring 中的事務主要是利用 Aop 思想,簡化事務的配置,可以通過 Java 配置也可以通過 XML 配置。

準備工作:

我們通過一個轉賬操作來看下 Spring 中的事務配置。

首先準備 SQL:

CREATE DATABASE /*!32312 IF NOT EXISTS*/test01 /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE test01;
/*Table structure for table account */
DROP TABLE IF EXISTS account;
CREATE TABLE account (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
money int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*Data for the table account */
insert into account(id,username,money) values (1,'zhangsan',1000),(2,'lisi',1000);

然後配置 JdbcTemplate ,JdbcTemplate 的配置和第5小節一致。

然後,提供轉賬操作的方法:

@Repository
public class UserDao {
    @Autowired
    JdbcTemplate jdbcTemplate;
public void addMoney(String username, Integer money) {
        jdbcTemplate.update("update account set money=money+? where username=?", money, username);
    }
public void minMoney(String username, Integer money) {
        jdbcTemplate.update("update account set money=money-? where username=?", money, username);
    }
}

@Service
public class UserService {
    @Autowired
    UserDao userDao;
    public void updateMoney() {
        userDao.addMoney("zhangsan", 200);
        int i = 1 / 0;
        userDao.minMoney("lisi", 200);
    }
}

最後,在 XML 檔案中,開啟自動化掃描:

<context:component-scan base-package="org.javaboy"/>

<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
    <property name="username" value="root"/>
    <property name="password" value="123"/>
    <property name="url" value="jdbc:mysql:///test01?serverTimezone=Asia/Shanghai"/>
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
</bean>
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

XML配置

XML 中配置事務一共分為三個步驟:

1.配置 TransactionManager

<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

2.配置事務要處理的方法

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="update*"/>
        <tx:method name="insert*"/>
        <tx:method name="add*"/>
        <tx:method name="delete*"/>
    </tx:attributes>
</tx:advice>

注意,一旦配置了方法名稱規則之後,service 中的方法一定要按照這裡的名稱規則來,否則事務配置不會生效

3.配置 Aop

<aop:config>
    <aop:pointcut id="pc1" expression="execution(* org.javaboy.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pc1"/>
</aop:config>

4.測試

@Before
public void before() {
    ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    jdbcTemplate = ctx.getBean(JdbcTemplate.class);
    userService = ctx.getBean(UserService.class);
}
@Test
public void test1() {
    userService.updateMoney();
}

java配置

如果要開啟Java註解配置,在XML配置中新增如下配置

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

這行配置可以代替下面兩個配置:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="update*"/>
        <tx:method name="insert*"/>
        <tx:method name="add*"/>
        <tx:method name="delete*"/>
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:pointcut id="pc1" expression="execution(* org.javaboy.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pc1"/>
</aop:config>

然後,在需要新增事務的方法上,新增 @Transactional 註解,表示該方法開啟事務,當然,這個註解也可以放在類上,表示這個類中的所有方法都開啟事務。

@Service
public class UserService {
    @Autowired
    UserDao userDao;
    @Transactional
    public void updateMoney() {
        userDao.addMoney("zhangsan", 200);
        int i = 1 / 0;
        userDao.minMoney("lisi", 200);
    }
}