1、声明式事务
2、Spring事务引入的分析------PlatformTransactionManager类简单介绍
3、注解式事务声明
4、xml配置式事务声明
5、Spring整合Web
1、声明式事务
事务分为声明式和编程式两种:
声明式事务:声明式事务是指通过注解的形式对事务的各种特性进行控制和管理。
编码式(编程式)事务:指的是通过编码的方式实现事务的声明。
1.1、编码方式实现事务:
1.2、声明式事务环境搭建
1.2.2、准备测试数据库
##创建tx数据库
drop database if exists `tx`;
CREATE database `tx`;
##切换tx数据库
USE `tx`;
##删除用户表
DROP TABLE IF EXISTS `user`;
##创建用户表
CREATE TABLE `user` (
`id` int primary key auto_increment,
`username` varchar(50) NOT NULL,
`money` int(11) DEFAULT NULL
);
##插入数据
insert into `user`(`username`,`money`) values ('张三',1000),('李四',1000);
##删除图书表
drop table if exists `book`;
##创建图书表
create table `book`(
`id` int primary key auto_increment,
`name` varchar(500) not null,
`stock` int
);
##插入数据
insert into book(`name`,`stock`) values('java编程思想',100),('C++编程思想',100);
##查看数据
select * from book;
select * from user;
1.2.2、创建一个Java工程,导入Jar包
JavaBean对象
public class Book {
private Integer id;
private String name;
private int stock;
public class User {
private Integer id;
private String username;
private int money;
Dao们
@Repository
public class BookDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public int updateBook() {
String sql = "update book set name = '**我被修改了!**' where id = 1";
return jdbcTemplate.update(sql);
}
}
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public int updateUser() {
String sql = "update user set username = '**我被修改了**' where id = 1";
return jdbcTemplate.update(sql);
}
}
Service代码
@Service
public class TransactionService {
@Autowired
private UserDao userDao;
@Autowired
private BookDao bookDao;
public void updateTwoTable() {
userDao.updateUser();
bookDao.updateBook();
}
}
1.3、测试Service的默认事务
实验1:测试service服务层的默认事务
@ContextConfiguration(locations = "classpath:application.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringTest {
@Autowired
private DataSource dataSource;
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private TransactionService transactionService;
@Test
public void testDataSource() throws Exception {
System.out.println(dataSource.getConnection());
}
@Test
public void testJdbcTempalte() throws Exception {
System.out.println( jdbcTemplate );
}
@Test
public void testTransaction() throws Exception {
transactionService.updateTwoTable();
}
}
异常的演示
public void updateTwoTable() {
userDao.updateUser();
int i = 12 / 0;
bookDao.updateBook();
}
结果:
但结果却是一张表更新了,另一种表未更新就发生异常,导致两张表不能同步,经典案例就是银行的转账,这边转过去了,对方没有收到。这里就要用到事务来处理了,要是在同一个事务中有一处出错,整个事务都回滚,从而阻止这种非一致性的更新操作。