Spring+JdbcTemplate进行事务管理
1.概念
(1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败
(2)典型场景:银行转账
2.事务四个特性(ACID)
(1)原子性:指事务是一个不可分割的整体,类似一个不可分割的原子
(2)一致性:保障事务前后这组数据的状态是一致的。要么都是成功的,要么都是失败的.
(3)隔离性:多个事务之间要相互隔离,不能互相干扰
(4)持久性:指事务一旦被提交,这组操作修改的数据就真的的发生变化了。即使接下来数据库故障也不应该对其有影响。
3.环境准备
-
创建数据库表account,添加记录
-
配置JdbcTemplate
@Configuration @ComponentScan(basePackages = "com.apple") public class TxConfig { @Bean("dataSource") public DruidDataSource getDruidDataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/exercise"); dataSource.setUsername("root"); dataSource.setPassword("root"); return dataSource; } @Bean public JdbcTemplate getJdbcTemplate(DataSource dataSource){ JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); return jdbcTemplate; } }
-
创建service,搭建dao,完成对象创建和注入关系
service注入dao,在dao注入JdbcTemplate,在JdbcTemplate注入DataSource
@Service public class AccountService { //注入Dao @Autowired private AccountDao accountDao; }
public interface AccountDao { }
@Repository public class AccountDaoImpl implements AccountDao{ //注入JdbcTemplate @Autowired private JdbcTemplate jdbcTemplate; }
-
在dao创建两个方法:多钱和少钱的方法,在service创建方法(转账的方法)
@Repository public class AccountDaoImpl implements AccountDao{ @Autowired private JdbcTemplate jdbcTemplate; //多钱 @Override public void addMoney() { String sql = "update account set money = money + ? where username = ?"; jdbcTemplate.update(sql,100,"mary"); } //少钱</