有关设置数据访问隔离级别的需求
本文讨论为组成 Enterprise JavaBeans (EJB) 2.x 和更高版本的模块的数据访问组件设置隔离级别的条件和影响。
在 EJB 1.1 模块中,可在方法级别或 Bean 级别设置隔离级别。此功能也适用于组装到 EJB 2.x 模块中的容器管理的持久性 (CMP) 1.1 Bean。WebSphere® Application Server 允许 CMP Bean 的部署描述符声明版本级别 1.1,而不必考虑整体模块版本。
但是,在方法级别或 Bean 级别设置隔离级别的功能不适用于 EJB 2.x 模块中的其他企业 Bean,包括 CMP 2.x Bean。WebSphere Application Server V5.0 在 EJB 2.0 模块中除去了此功能,以使提供的体系结构最终能更有效地进行连接。
- 不能对 EJB 方法级别或 Bean 级别指定隔离级别。
- 如果将 JDBC 应用程序、Bean 管理的持久性 (BMP) Bean 或 Servlet 配置为参与全局事务,那么共享的任何连接都不能接受用户指定的隔离级别。WebSphere Application Server 对未在全局事务中共享的连接只能设置用户指定的隔离级别。通常您需要避免对可共享连接指定隔离级别。
- 2.x CMP Bean 使用的连接的隔离级别
- 在 EJB 2.x 模块中,当 CMP 2.x Bean 使用新的数据源访问后端数据库时,WebSphere Application Server 运行时将根据指定给该 Bean 或调用方法的访问意向类型来确定隔离级别。其他非 CMP 连接用户可访问这一相同数据源,还可使用访问意向和应用程序概要文件支持来管理它们的并行控制。
- 其他 2.x 企业 Bean 和其他非 CMP 组件使用的连接
- 对于所有其他的 JDBC 连接实例(CMP Bean 使用的连接除外),您可以对数据源资源引用指定隔离级别。对于在全局事务中运行的可共享连接,此方法是为连接设置隔离级别的唯一方法。不允许尝试通过在全局事务中运行的可共享的连接上的 setTransactionIsolation() 方法直接设置隔离级别。要在连接上使用不同的隔离级别,您必
须提供不同的资源引用。通过组装工具设置这些缺省值。
每个资源引用与一个隔离级别关联。当应用程序使用此资源引用 Java™ 命名和目录接口 (JNDI) 名称查找数据源时,从该数据源返回的使用此资源引用的每个连接都具有相同的隔离级别。
如果组件需要使用可共享连接并需要多个隔离级别,它们可以创建多个资源引用,并给它们不同的 JNDI 名称,使组件代码能查找与组件所需隔离级别相应的数据源。使用此方法,不同的连接可启用不同的隔离级别。
能将这多个资源引用映射至已配置的同一个数据源。但是,该连接仍然来自同一个底层池;连接管理器不允许带有不同隔离级别的资源引用请求的连接共享。请考虑下列情况:- 数据源绑定至以下两个资源引用:jdbc/RRResRef 和 jdbc/RCResRef。
- RRResRef 定义了 RepeatableRead 隔离级别。RCResRef 定义了 ReadCommitted 隔离级别。
该产品不需要您对非 CMP 应用程序模块的数据源资源引用设置隔离级别。如果未对资源引用指定隔离级别,或者如果指定 TRANSACTION_NONE,那么 WebSphere Application Server 运行时将对数据源使用缺省隔离级别。Application Server 使用基于 JDBC 驱动程序的缺省设置。
对于大多数驱动程序,WebSphere Application Server 使用隔离级别缺省值 TRANSACTION_REPEATABLE_READ。对于 Oracle 驱动程序,Application Server 使用隔离级别 TRANSACTION_READ_COMMITTED。使用下表以获取快速引用:
数据库: 缺省隔离级别: DB2® RR Oracle RC Sybase RR Informix® RR Apache Derby RR SQL 服务器 RR 注: 对数据源进行直接 JNDI 查询时,将使用这些相同的缺省隔离级别。- RR = JDBC 可重复读 (TRANSACTION_REPEATABLE_READ)
- RC = JDBC 已落实读 (TRANSACTION_READ_COMMITTED)
要定制缺省隔离级别,您可以使用数据源的 webSphereDefaultIsolationLevel 定制属性。在大多数情况下,打包 EAR 文件时,您应在部署描述符中定义隔离级别,但是在特定情况中,您可能需要定制缺省隔离级别。如果使用了前面的任何选项,那么此属性将无效,此定制属性主要用于没有其他方法来设置隔离级别的那些情况。
对 webSphereDefaultIsolationLevel 定制属性使用以下值:
要为数据源定义此定制属性,请执行以下操作:可能的值 JDBC 隔离级别 DB2 隔离级别 8 TRANSACTION_SERIALIZABLE 可重复读 (RR) 4(缺省值) TRANSACTION_REPEATABLE_READ 读稳定性 (RS) 2 TRANSACTION_READ_COMMITTED 游标稳定性 (CS) 1 TRANSACTION_READ_UNCOMMITTED 未落实的读 (UR) 0
TRANSACTION_NONE 未落实 (NC) - 单击 。
- 单击“其他属性”部分的数据源。
- 单击数据源的名称。
- 单击定制属性。
- 创建 webSphereDefaultIsolationLevel 定制属性。
- 单击新建。
- 对名称字段输入 webSphereDefaultIsolationLevel。
- 在值字段中输入一个可能值。
- 资源引用隔离级别
- 访问意向策略指定的隔离级别
- 配置隔离级别的定制属性
- 应用程序服务器的缺省设置。