示例:读读一致性检查
读读一致性检查仅适用从另一个事务中读取其数据的 LifeTimeInCache Bean。
使用方案
对于可重复读 (RR) 的访问意向,这意味着产品检查与数据存储中一致的数据,并确保检查后不更新。对于落实读 (RC) 的访问意向,这意味着产品将检查数据在检查时是否一致,但它不保证检查后不会更改该数据。这使得 LifeTimeInCache Bean 的行为与非 LifeTimeInCache Bean 的行为相同。
设置一致性检查时有三个选项,如以下方案中所示,该方案包括计算 Ann 的银行帐户中的利息。在每种情况中,此 Enterprise JavaBeans (EJB) 容器受管持久状态 (CMP) 应用程序共享数据存储以计算感兴趣的其他应用程序,例如 EJB Bean 受管持久状态 (BMP)、Java 数据库连接 (JDBC) 或旧应用程序。 同样,在每种情况中,配置 EJB 帐户为 long-lifetime bean。
NONE
- 服务器启动。
- 事务 1 中的 User1 调用 Account.findByPrimaryKey("10001"),从数据库读取 Ann 的帐户数据,其余额为 $100。
- 由服务器上的持久性管理器 (PM) 高速缓存 Ann 的记录。
- User2 编写 JDBC 调用并将余额更改为 $120。
- 事务 2 中的 User3 针对帐户 "10001" 调用 Account.findByPrimaryKey(),从高速缓存读取 Ann 的数据,其余额为 $100。
- 计算 Ann 的利息,但是结果可能不正确,这是由于数据完整性问题造成的。
读读检查 AT_TRAN_BEGIN
- 服务器启动。
- 事务 1 中的 User1 调用 Account.findByPrimaryKey("10001"),从数据库读取 Ann 的帐户数据,其余额为 $100。
- 由服务器上的持久性管理器 (PM) 高速缓存 Ann 的记录。
- User2 编写 JDBC 调用并将余额更改为 $120。
- 事务 2 中的 User3 针对帐户 "10001" 调用 Account.findByPrimaryKey(),从高速缓存读取 Ann 的数据,其余额为 $100。
- PM 对 Ann 的帐户执行读读检查并发现余额 100 已被更改。PM 执行数据库查询以检索余额 $120,并重新刷新高速缓存中 Ann 的数据。
- 因为数据完整性是受保护的,所以在继续进行事务的情况下可计算 Ann 的利息。
读读检查 AT_TRAN_END
- 服务器启动。
- 事务 1 中的 User1 调用 Account.findByPrimaryKey("10001"),从数据库读取 Ann 的帐户数据,其余额为 $100。
- 由服务器上的持久性管理器 (PM) 高速缓存 Ann 的记录。
- User2 编写 JDBC 调用并将余额更改为 $120。
- 事务 2 中的 User3 针对帐户 "10001" 调用 Account.findByPrimaryKey(),从数据库读取 Ann 的数据,其余额为 $100。
- 计算 Ann 的利息。
- 事务 2 结束期间,PM 对 Ann 的帐户执行读读检查,并发现余额 100 已被更改。
- PM 回滚该事务并使高速缓存无效。该事务失败并且数据完整性又是受保护的。