当我在代码中设置事务隔离级别时,它是在代码中还是在 DBMS 中强制执行?
When I set transaction isolation level in code, is it enforced in code or in DBMS?
如果我在 Java 代码中这样调用:
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
这是在代码中通过 DBMS table/row-level 锁强制执行的,还是根据 JDBC 驱动程序实现的其中一个强制执行的?
谢谢!
隔离级别由数据库引擎强制执行,而不是应用程序代码。
如果您有兴趣,这里有关于该主题的很好的资源。 Isolation Levels
您使用的 JDBC API 依赖于底层 JDBC 驱动程序实现,而驱动程序实现依赖于底层 RDBMS :
A JDBC driver might not support all transaction isolation levels. If a driver does not support the isolation level specified in an invocation of setTransactionIsolation, the driver can substitute a higher, more restrictive transaction isolation level. If a driver cannot substitute a higher transaction level, it throws a SQLException. Use the method DatabaseMetaData.supportsTransactionIsolationLevel to determine whether or not the driver supports a given level.
如果您使用的是 JTA API,您将依赖于实现 JCA 契约的底层实现。在关系数据库资源的情况下,合同也将由 RDBMS 实施,但对于另一种类型的资源(例如 JMS 资源),肯定可以以不同的方式实施(例如,使用代码)。
如果我在 Java 代码中这样调用:
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
这是在代码中通过 DBMS table/row-level 锁强制执行的,还是根据 JDBC 驱动程序实现的其中一个强制执行的?
谢谢!
隔离级别由数据库引擎强制执行,而不是应用程序代码。
如果您有兴趣,这里有关于该主题的很好的资源。 Isolation Levels
您使用的 JDBC API 依赖于底层 JDBC 驱动程序实现,而驱动程序实现依赖于底层 RDBMS :
A JDBC driver might not support all transaction isolation levels. If a driver does not support the isolation level specified in an invocation of setTransactionIsolation, the driver can substitute a higher, more restrictive transaction isolation level. If a driver cannot substitute a higher transaction level, it throws a SQLException. Use the method DatabaseMetaData.supportsTransactionIsolationLevel to determine whether or not the driver supports a given level.
如果您使用的是 JTA API,您将依赖于实现 JCA 契约的底层实现。在关系数据库资源的情况下,合同也将由 RDBMS 实施,但对于另一种类型的资源(例如 JMS 资源),肯定可以以不同的方式实施(例如,使用代码)。