Spring事务

数据库事务


  • 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());
	}
}

转载于:https://my.oschina.net/u/4116644/blog/3039389

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值