1. 概念
- 事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败。
- 事务四个特性(ACID)
(1)原子性
(2)一致性
(3)隔离性
(4)持久性
2. 转账demo
demo整体结构
- 创建数据库表,并添加记录
- 创建xml配置文件
<?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:context="http://www.springframework.org/schema/context"
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/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--开启注解扫描-->
<context:component-scan base-package="com.spring"></context:component-scan>
<!--数据库连接池配置-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="jdbc:mysql:///userdb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
</bean>
<!--jdbcTemplate配置-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>
或者使用全注解开发,创建配置类(作用同xml配置文件)
@Configuration //配置类注解
@ComponentScan(basePackages = "com.spring")
@EnableTransactionManagement //开启事务
public class TxConfig {
//创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///userdb");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
//创建JdbcTemplate对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
//创建事务管理器
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
- 创建UserDaoImpl.java和UserService.java
UserDaoImpl.java
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void add() {
String sql = "update t_account set money = money + ? where username = ?";
jdbcTemplate.update(sql, 100, "CLarie");
}
@Override
public void reduce() {
String sql = "update t_account set money = money - ? where username = ?";
jdbcTemplate.update(sql, 100, "Chiancc");
}
}
UserService.java
@Service
@Transactional //开启事务
public class UserService {
//调用两个方法完成转账
@Autowired
private UserDao userDao;
public void transfer() {
userDao.reduce();
// int i = 2 / 0;
userDao.add();
}
}
- 测试类TestTrans.java
public class TestTrans {
@Test
public void test() {
ApplicationContext context =
new ClassPathXmlApplicationContext("config.xml"); //使用xml配置文件
UserService userService = context.getBean("userService", UserService.class);
userService.transfer();
}
@Test
public void test2() {
ApplicationContext context =
new AnnotationConfigApplicationContext(TxConfig.class); //使用配置类
UserService userService = context.getBean("userService", UserService.class);
userService.transfer();
}
}