【Spring】声明式事务管理

步骤:

引入jar包

spring-core相关jar包

spring-jdbc相关jar包

spring-aop相关jar包


xml方式实现声明式事务管理

先创建一个Dept类

package cn.qblank.a_tx;

public class Dept {
	private int deptId;
	private String deptName;
	public int getDeptId() {
		return deptId;
	}
	public void setDeptId(int deptId) {
		this.deptId = deptId;
	}
	public String getDeptName() {
		return deptName;
	}
	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}
}

然后写好对应的DeptDao类

package cn.qblank.a_tx;

import org.springframework.jdbc.core.JdbcTemplate;

public class DeptDao {
	//容器注入jdbcTemplate对象
	private JdbcTemplate jdbcTemplate;
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	public void save(Dept dept){
		String sql = "insert into dept(deptName) value(?) ";
		jdbcTemplate.update(sql,dept.getDeptName());
	}
}

DeptService类

package cn.qblank.a_tx;

public class DeptService {
	//注入IOC容器
	private DeptDao deptDao;
	public void setDeptDao(DeptDao deptDao) {
		this.deptDao = deptDao;
	}
	public void save(Dept dept){
		deptDao.save(dept);
		//发生异常,全部回滚
		int i = 1/0;
	}
}




写好jdbc的连接配置db.properties放在src目录下:

jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///day09
jdbc.initPoolSize=5
jdbc.maxPoolSize=10
jdbc.maxStatements=100
jdbc.acquireIncrement=2

接下来就是关键的一部,使用spring配置连接配置信息,注入相关实例,并进行声明事务管理配置



    
    
    
	
	
		
		
		
		
		
		
		
		
	
	
	
		
	
	
	
		
	
	
	
		
	
	
	
	
		
	
	
	
		
			
			
			
			
		
	
	
	
	
		
		
		
		
		

最后我们再对其进行测试

package cn.qblank.a_tx;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("cn/qblank/a_tx/bean.xml");
		Dept dept = new Dept();
		dept.setDeptName("软件测试部");
		DeptService deptService = (DeptService) ac.getBean("deptService");
		deptService.save(dept);
		
		System.out.println("添加成功");
		ac = null;
	}
}

运行结果:

【Spring】声明式事务管理_第1张图片


数据库信息

【Spring】声明式事务管理_第2张图片

由此看出,事务发生了回滚。


使用注解方式实现声明式事务管理

实体类对象和上面一样


接下来编写DeptDao类

package cn.qblank.anno;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository("deptDao")
public class DeptDao {
	//容器注入jdbcTemplate对象
	@Resource(name="jdbcTemplate")
	private JdbcTemplate jdbcTemplate;
	public void save(Dept dept){
		String sql = "insert into dept(deptName) value(?) ";
		jdbcTemplate.update(sql,dept.getDeptName());
	}
}

LogDao类

package cn.qblank.anno;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Repository("logDao")
public class LogDao {
	@Resource(name="jdbcTemplate")
	private JdbcTemplate jdbcTemplate;
	@Transactional(propagation = Propagation.REQUIRED)
	public void insertLog(){
		jdbcTemplate.update("insert into t_deptLog(logName) value('插入一条dept表!!!')");
	}
}

编写DeptService注解注入属性

package cn.qblank.anno;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class DeptService {
	//注入IOC容器
	@Resource
	private DeptDao deptDao;
	@Resource
	private LogDao logDao;
	/**
	 * 事务控制
	 * @param dept
	 */
	public void saveLog(){
		logDao.insertLog();
	}
	/**
	 * 保存
	 * @param dept
	 */
	@Transactional(
			readOnly= false,	//设置只读属性
			timeout = -1,		//设置不限时
			isolation = Isolation.DEFAULT,	//隔离级别:默认
			propagation = Propagation.REQUIRED	//数据库的传播行为
	)
	public void save(Dept dept){
		deptDao.save(dept);
		saveLog();
	}
	
}

配置bean.xml文件,加载文件,配置数据源,注入jdbcTemplate实例,配置事务管理类,开启注解扫描,注解方式实现事务管理



    
    
    
	
	
		
		
		
		
		
		
		
		
	
	
	
		
	
	
	
		
	
	
	
	
	

上面可以看到,我们再insertLog方法里面写了个异常,接下来我们来测试下是否回滚这个异常

首先弹出错误信息

【Spring】声明式事务管理_第3张图片


接下来我们看看数据库是否发生回滚

【Spring】声明式事务管理_第4张图片

【Spring】声明式事务管理_第5张图片

可以发现数据库的数据并没有发生变化,所以我们回滚成功了!!!





你可能感兴趣的:(------,Spring,①java学习,Spring)