数据库事务
Spring中的事务配置方式:
- 1、xml方式的配置实现
- 2、注解方式的实现
概述:
数据库事务(Database Transaction) ,是指数据库管理系统执行过程中的一个逻辑单位,用于同时操作多个DML操作时,保证多个DML操作要么完全执行,要么都不执行。在数据库上保证数据的一致性。
数据库事务的四大特性(ACID):
数据库事务拥有以下四个特性,习惯上被称之为ACID特性。
原子性(Atomicity): 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency): 事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
隔离性(Isolation): 多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability): 已被提交的事务对数据库的修改应该永久保存在数据库中。
xml方式的配置实现
1、创建dao层的接口和实现类:
/**
* dao层接口
* @author 叶小陌
*
*/
public interface IUserDao {
/**
* 创建两个普通方法
*/
public void add();
public void min();
}
实现类:
/**
* 实现了dao接口的实现类
* @author 叶小陌
*
*/
public class UserDaoImpl implements IUserDao {
/**
* JdbcTemplate类 Spring底层封装了jdbc,用于处理数据库连接问题
* 生成jdbcTemplate成员变量,用于注入到Spring容器中
*
*/
JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void add() {
String sql = "insert into user (name,age)values(?,?)";
int update = jdbcTemplate.update(sql, "小风1111",22);
System.out.println(update);
}
@Override
public void min() {
String sql = "update user set name = ? where id = ?";
int update = jdbcTemplate.update(sql,"小沫1111",10);
System.out.println(update);
}
}
2、创建service层的接口和实现类:
/**
* service层接口
* @author 叶小陌
*
*/
public interface IUserService {
public void update();
}
实现类:
/**
* 实现了service接口的实例类
* @author 叶小陌
*
*/
public class UserSereviceImpl implements IUserService {
UserDaoImpl dao;
public UserDaoImpl getDao() {
return dao;
}
public void setDao(UserDaoImpl dao) {
this.dao = dao;
}
@Override
public void update() {
dao.min();
//int i = 1/0;
dao.add();
}
}
3、创建applicationContext.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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 打开cglib代理模式,可以通过getBean方法的接口实现类的类加载器获取实例 -->
<aop:config proxy-target-class="true"></aop:config>
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/zmf"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
<constructor-arg name="dataSource" ref="dataSource"/>
</bean>
<bean class="com.sxt.dao.impl.UserDaoImpl" id="userDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<bean class="com.sxt.service.impl.UserSereviceImpl" id="userServiceImpl">
<property name="dao" ref="userDaoImpl"/>
</bean>
<!-- 配置事务 -->
<!-- 配置事务管理器 -->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 可以代替配置事务三大步的后两步 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 配置事务方法 -->
<!--
<tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager">
<tx:attributes>
<tx:method name="add*"/>
<tx:method name="insert*"/>
<tx:method name="update*"/>
<tx:method name="delete*"/>
<tx:method name="query*"/>
<tx:method name="min*"/>
</tx:attributes>
</tx:advice>
配置AOP
<aop:config>
<aop:pointcut expression="execution(* com.sxt.service.impl.*.*(..))" id="pc"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config> -->
</beans>
注意:
如果在获取对象时,通过接口实例类加载获取,会报异常,我们只需要在xml配置文件中配置如下代码:
<!-- 打开cglib代理模式,可以通过getBean方法的接口实现类的类加载器获取实例 -->
<aop:config proxy-target-class="true"></aop:config>
注解方式的实现:
1、创建dao层的接口和实现类:
public interface IUserDao {
public void add();
public void min();
}
/**
*实例类
*/
@Repository
public class UserDaoImpl implements IUserDao {
@Autowired //自动注入
JdbcTemplate jdbcTemplate;
@Override
public void add() {
String sql = "insert into user (name,age)values(?,?)";
int update = jdbcTemplate.update(sql, "小风1111",22);
System.out.println(update);
}
@Override
public void min() {
String sql = "update user set name = ? where id = ?";
int update = jdbcTemplate.update(sql,"小沫1111",10);
System.out.println(update);
}
}
2、创建service层的接口和实现类:
public interface IUserService {
@Transactional //开启使用注解的方式
public void update();
}
@Service
public class UserSereviceImpl implements IUserService {
@Autowired //开启自动注入
UserDaoImpl dao;
@Override
public void update() {
dao.min();
int i = 1/0;
dao.add();
}
}
3、创建Java配置类:
@Configuration
@ComponentScan("com.sxt")
@EnableTransactionManagement //开启注解事务支持
public class JavaConfig {
@Bean
DriverManagerDataSource dataSource(){
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/zmf");
ds.setUsername("root");
ds.setPassword("root");
return ds;
}
@Bean
JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(dataSource());
}
@Bean
DataSourceTransactionManager transactionManager(){
return new DataSourceTransactionManager(dataSource());
}
}