实验二 应用最基本的事务控制
1、加事务前状态
①搞破坏
修改 EmpDao 中的 updateEmpSalaryById()方法:
public void updateEmpSalaryById(Integer empId, Double salary) {
// 为了看到操作失败后的效果人为将 SQL 语句破坏<br /> String sql = "upd222ate t_emp set emp_salary=? where emp_id=?";<br /> jdbcTemplate.update(sql, salary, empId);<br />}
②执行Service方法
@Test
public void testBaseTransaction() {
Integer empId4EditName = 2;<br /> String newName = "new-name";
Integer empId4EditSalary = 3;<br /> Double newSalary = 444.44;
empService.updateTwice(empId4EditName, newName, empId4EditSalary, newSalary);
}
效果:修改姓名的操作生效了,修改工资的操作没有生效。
2、添加事务功能
①配置事务管理器
<!-- 事务管理器的bean只需要装配数据源,其他属性保持默认值即可 --><br /> <property name="dataSource" ref="druidDataSource"/><br /></bean>
②开启基于注解的声明式事务功能
注意:导入名称空间时有好几个重复的,我们需要的是 tx 结尾的那个。
③在需要事务的方法上使用注解
@Transactional
public void updateTwice(
// 修改员工姓名的一组参数
Integer empId4EditName, String newName,
// 修改员工工资的一组参数<br /> Integer empId4EditSalary, Double newSalary<br /> ) {
// 为了测试事务是否生效,执行两个数据库操作,看它们是否会在某一个失败时一起回滚<br /> empDao.updateEmpNameById(empId4EditName, newName);
empDao.updateEmpSalaryById(empId4EditSalary, newSalary);
}
④测试
junit测试方法不需要修改,执行后查看数据是否被修改。
3、从日志内容角度查看事务效果
①加入依赖
②加入logback的配置文件
文件名:logback.xml
<?xml version=”1.0” encoding=”UTF-8”?>
<!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR --><br /> <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 --><br /> <root level="INFO"><br /> <!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender --><br /> <appender-ref ref="STDOUT" /><br /> </root>
<!-- 根据特殊需求指定局部日志级别 --><br /> <logger name="org.springframework.jdbc.datasource.DataSourceTransactionManager" level="DEBUG"/><br /> <logger name="org.springframework.jdbc.core.JdbcTemplate" level="DEBUG" />
③日志中事务相关内容
[1]事务回滚时
[11:37:36.965] [DEBUG] [main] [org.springframework.jdbc.datasource.DataSourceTransactionManager] [ Creating new transaction with name [com.atguigu.tx.service.EmpService.updateTwice]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT] [11:37:37.328] [INFO ] [main] [com.alibaba.druid.pool.DruidDataSource] [{dataSource-1} inited] [11:37:37.815] [DEBUG] [main] [org.springframework.jdbc.datasource.DataSourceTransactionManager] [ Acquired Connection [com.mysql.jdbc.JDBC4Connection@6b6776cb] for JDBC transaction] [11:37:37.818] [DEBUG] [main] [org.springframework.jdbc.datasource.DataSourceTransactionManager] [ Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@6b6776cb] to manual commit]
[11:44:32.311] [DEBUG] [main] [org.springframework.jdbc.core.JdbcTemplate] [Executing prepared SQL update] [11:44:32.312] [DEBUG] [main] [org.springframework.jdbc.core.JdbcTemplate] [Executing prepared SQL statement [update t_emp set emp_name=? where emp_id=?]] [11:44:32.339] [DEBUG] [main] [org.springframework.jdbc.core.JdbcTemplate] [Executing prepared SQL update] [11:44:32.339] [DEBUG] [main] [org.springframework.jdbc.core.JdbcTemplate] [Executing prepared SQL statement [upd222ate t_emp set emp_salary=? where emp_id=?]]
[11:37:37.931] [DEBUG] [main] [org.springframework.jdbc.datasource.DataSourceTransactionManager] [Initiating transaction rollback] [11:37:37.931] [DEBUG] [main] [org.springframework.jdbc.datasource.DataSourceTransactionManager] [Rolling back JDBC transaction on Connection [com.mysql.jdbc.JDBC4Connection@6b6776cb]] [11:37:37.933] [DEBUG] [main] [org.springframework.jdbc.datasource.DataSourceTransactionManager] [Releasing JDBC Connection [com.mysql.jdbc.JDBC4Connection@6b6776cb] after transaction]
[2]事务提交时
[11:42:40.093] [DEBUG] [main] [org.springframework.jdbc.datasource.DataSourceTransactionManager] [Creating new transaction with name [com.atguigu.tx.service.EmpService.updateTwice]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT] [11:42:40.252] [INFO ] [main] [com.alibaba.druid.pool.DruidDataSource] [{dataSource-1} inited] [11:42:40.655] [DEBUG] [main] [org.springframework.jdbc.datasource.DataSourceTransactionManager] [Acquired Connection [com.mysql.jdbc.JDBC4Connection@6b6776cb] for JDBC transaction] [11:42:40.661] [DEBUG] [main] [org.springframework.jdbc.datasource.DataSourceTransactionManager] [Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@6b6776cb] to manual commit] [11:42:40.681] [DEBUG] [main] [org.springframework.jdbc.core.JdbcTemplate] [Executing prepared SQL update] [11:42:40.682] [DEBUG] [main] [org.springframework.jdbc.core.JdbcTemplate] [Executing prepared SQL statement [update t_emp set emp_name=? where emp_id=?]] [11:42:40.710] [DEBUG] [main] [org.springframework.jdbc.core.JdbcTemplate] [Executing prepared SQL update] [11:42:40.711] [DEBUG] [main] [org.springframework.jdbc.core.JdbcTemplate] [Executing prepared SQL statement [update t_emp set emp_salary=? where emp_id=?]] [11:42:40.712] [DEBUG] [main] [org.springframework.jdbc.datasource.DataSourceTransactionManager] [Initiating transaction commit] [11:42:40.712] [DEBUG] [main] [org.springframework.jdbc.datasource.DataSourceTransactionManager] [Committing JDBC transaction on Connection [com.mysql.jdbc.JDBC4Connection@6b6776cb]] [11:42:40.714] [DEBUG] [main] [org.springframework.jdbc.datasource.DataSourceTransactionManager] [Releasing JDBC Connection [com.mysql.jdbc.JDBC4Connection@6b6776cb] after transaction]
4、debug查看事务管理器中的关键方法
类:org.springframework.jdbc.datasource.DataSourceTransactionManager