[[toc]]

实验二 应用最基本的事务控制

1、加事务前状态

①搞破坏

修改 EmpDao 中的 updateEmpSalaryById()方法:
public void updateEmpSalaryById(Integer empId, Double salary) {

  1. // 为了看到操作失败后的效果人为将 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() {

  1. Integer empId4EditName = 2;<br /> String newName = "new-name";
  2. Integer empId4EditSalary = 3;<br /> Double newSalary = 444.44;
  3. empService.updateTwice(empId4EditName, newName, empId4EditSalary, newSalary);

}

效果:修改姓名的操作生效了,修改工资的操作没有生效。

2、添加事务功能

①配置事务管理器

实验二 应用最基本的事务控制 - 图1


<!-- 事务管理器的bean只需要装配数据源,其他属性保持默认值即可 --><br />    <property name="dataSource" ref="druidDataSource"/><br /></bean>

②开启基于注解的声明式事务功能

实验二 应用最基本的事务控制 - 图2





注意:导入名称空间时有好几个重复的,我们需要的是 tx 结尾的那个。
实验二 应用最基本的事务控制 - 图3

③在需要事务的方法上使用注解

实验二 应用最基本的事务控制 - 图4

@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、从日志内容角度查看事务效果

①加入依赖



ch.qos.logback
logback-classic
1.2.3

②加入logback的配置文件

文件名:logback.xml
<?xml version=”1.0” encoding=”UTF-8”?>


class=”ch.qos.logback.core.ConsoleAppender”>



[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n

<!-- 设置全局日志级别。日志级别按顺序分别是: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

①开启事务的方法

实验二 应用最基本的事务控制 - 图5

实验二 应用最基本的事务控制 - 图6

②提交事务的方法

实验二 应用最基本的事务控制 - 图7

③回滚事务的方法

实验二 应用最基本的事务控制 - 图8

上一个实验 回目录 下一个实验