文档首页
MySQL Connector/J 开发人员指南
相关文档 下载本手册
PDF (US Ltr) - 1.2Mb
PDF (A4) - 1.2Mb


15.2 事务性 JDBC 访问

Spring 允许我们在代码中添加事务,而无需直接处理 JDBC 类。为此,Spring 提供了一个事务管理包,它不仅取代了 JDBC 事务管理,而且还支持声明式事务管理(配置而不是代码)。

要使用事务性数据库访问,我们需要更改 world 数据库中表的存储引擎。下载的脚本显式创建了 MyISAM 表,它们不支持事务语义。InnoDB 存储引擎支持事务,这是我们将要使用的存储引擎。我们可以使用以下语句更改存储引擎。

ALTER TABLE City ENGINE=InnoDB;
ALTER TABLE Country ENGINE=InnoDB;
ALTER TABLE CountryLanguage ENGINE=InnoDB;

Spring 强调的一种良好的编程实践是分离接口和实现。这意味着我们可以创建一个 Java 接口,并且只使用该接口上的操作,而无需任何关于实际实现的内部知识。我们将让 Spring 管理实现,并使用它来管理我们实现的事务。

首先,您创建一个简单的接口

public interface Ex3Dao {
    Integer createCity(String name, String countryCode,
    String district, Integer population);
}

此接口包含一个方法,该方法将在数据库中创建一个新的城市记录并返回新记录的 ID。接下来,您需要创建此接口的实现。

public class Ex3DaoImpl implements Ex3Dao {
    protected DataSource dataSource;
    protected SqlUpdate updateQuery;
    protected SqlFunction idQuery;

    public Integer createCity(String name, String countryCode,
        String district, Integer population) {
            updateQuery.update(new Object[] { name, countryCode,
                   district, population });
            return getLastId();
        }

    protected Integer getLastId() {
        return idQuery.run();
    }
}

您可以看到,我们只对抽象查询对象进行操作,而不是直接处理 JDBC API。此外,这是完整的实现。我们所有的事务管理都将在配置中处理。要开始配置,我们需要创建 DAO。

<bean id="dao" class="code.Ex3DaoImpl">
    <property name="dataSource" ref="dataSource"/>
    <property name="updateQuery">...</property>
    <property name="idQuery">...</property>
</bean>

现在我们需要设置事务配置。我们必须做的第一件事是创建事务管理器来管理数据源以及对 dao 方法所需事务属性的规范。

<bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

上面的代码创建一个事务管理器,它处理为其提供的数据源的事务。txAdvice 使用此事务管理器,并且属性指定为所有方法创建事务。最后,我们需要使用 AOP 切点应用此建议。

<aop:config>
    <aop:pointcut id="daoMethods"
        expression="execution(* code.Ex3Dao.*(..))"/>
     <aop:advisor advice-ref="txAdvice" pointcut-ref="daoMethods"/>
</aop:config>

这基本上表示对 Ex3Dao 接口调用的所有方法都将被包装在一个事务中。要使用它,我们只需从应用程序上下文检索 dao 并对 dao 实例调用方法即可。

Ex3Dao dao = (Ex3Dao) ctx.getBean("dao");
Integer id = dao.createCity(name,  countryCode, district, pop);

我们可以从此验证,我们的 Java 代码中没有发生事务管理,它全部通过 Spring 配置完成。这是一个非常强大的概念,被认为是 Spring 最有益的功能之一。