Spring-事务管理(概念和环境搭建)
1.什么是事务?
(1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败
(2)典型场景:银行转账
2.事务特性(ACID)
(1)原子性:要么都执行,要么都不执行
(2)一致性:操作前后总量不变
(3)隔离性:
(4)持久性:
3.搭建事务操作基本环境
(1)银行转账例子环境
1.创建数据库表,添加记录
2.创建service,搭建dao,完成对象创建和注入关系
(1)service注入dao,在dao注入JdbcTemplate,在JdbcTemplate注入dataSource
package com.orzjiangxiaoyu.spring.service; import com.orzjiangxiaoyu.spring.dao.BankDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author orz * @create 2020-08-18 16:32 */ @Service public class BankService { @Autowired private BankDao bankDao; }
package com.orzjiangxiaoyu.spring.dao; /** * @author orz * @create 2020-08-18 16:32 */ public interface BankDao { }
package com.orzjiangxiaoyu.spring.dao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; /** * @author orz * @create 2020-08-18 16:32 */ @Repository public class BankDaoImpl implements BankDao { @Autowired private JdbcTemplate jdbcTemplate; }
(2)在dao里面创建两个方法:少钱方法、多钱方法
package com.orzjiangxiaoyu.spring.dao; /** * @author orz * @create 2020-08-18 16:32 */ public interface BankDao { public void addMoney(); public void reduceMoney(); }
package com.orzjiangxiaoyu.spring.dao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; /** * @author orz * @create 2020-08-18 16:32 */ @Repository public class BankDaoImpl implements BankDao { //AA转账100给BB @Autowired private JdbcTemplate jdbcTemplate; //多钱的方法 //BB+100 @Override public void addMoney() { String sql="update user_table set balance=balance+? where user=?"; int update = jdbcTemplate.update(sql, 100, "BB"); System.out.println(update); } //少钱的方法 //AA-100 @Override public void reduceMoney() { String sql="update user_table set balance=balance-? where user=?"; int update = jdbcTemplate.update(sql, 100, "AA"); System.out.println(update); } }
(3)在service里面创建转账方法
package com.orzjiangxiaoyu.spring.service; import com.orzjiangxiaoyu.spring.dao.BankDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author orz * @create 2020-08-18 16:32 */ @Service public class BankService { @Autowired private BankDao bankDao; //转账方法 public void accountMoney() { //AA减100 bankDao.reduceMoney(); //BB加100 bankDao.addMoney(); } }
(5)测试
package com.orzjiangxiaoyu.spring.testdemo; import com.orzjiangxiaoyu.spring.service.BankService; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author orz * @create 2020-08-18 16:49 */ public class Test1 { @Test public void test1() { ApplicationContext context=new ClassPathXmlApplicationContext("jdbcbean.xml"); BankService bankService = context.getBean("bankService", BankService.class); bankService.accountMoney(); } }
上面代码如果正常执行没有问题的,但是如果代码出现异常则会出现问题
使用事务进行解决