使用CFTRANSACTION和ORM EntityLoad

时间:2015-10-20 10:19:39

标签: sql-server orm coldfusion

我正在使用ColdFusion 9和MS SQL Server。

我正在尝试使用:

<cftransaction isolation="read_uncommitted">
   <cfset X = EntityLoad('table',row_id,true)>
</cftransaction>

更改某些交易中的隔离级别

但从数据源查看日志我得到了这个:

09:20:32.688)>> Connection[6].prepareStatement(String sql)
09:20:32.688)>> sql = select ..... _ID=?
09:20:32.688)>> OK (PreparedStatement[871])
09:20:32.689)>> PreparedStatement[871].executeQuery()
09:20:33.594)>> OK (ResultSet[989])
09:20:33.606)>> Connection[6].setTransactionIsolation(int level)
09:20:33.606)>> level = 1
09:20:33.962)>> OK
09:20:34.141)>> Connection[6].setTransactionIsolation(int level)
09:20:34.141)>> level = 2
09:20:34.501)>> OK

如果替换EntityLoad进行简单的cfquery调用,我会得到:

09:24:30.164)>> Connection[6].setTransactionIsolation(int level)
09:24:30.164)>> level = 1
09:24:30.519)>> OK
09:24:30.519)>> Statement[37].execute(String sql, int autoGeneratedKeys)
09:24:30.519)>> sql = select ...
09:24:30.519)>> autoGeneratedKeys = 1
09:24:30.699)>> OK (true)
09:24:30.879)>> Connection[6].setTransactionIsolation(int level)
09:24:30.879)>> level = 2
09:24:31.234)>> OK

因此,当我使用ORM的EntityLoad时,隔离级别未正确设置。

有谁知道为什么?什么是使用ORM设置隔离级别的更好方法?

1 个答案:

答案 0 :(得分:1)

我在Cump Gratz的ColdBox博客上发现了一篇关于此事的帖子:Coldfusion ORM - Transaction Isolation Level...阅读其中的全文,它有一些好处。但基本上Curt发现你可以创建一个自定义的hibernate配置文件来指定各种设置。

从博客文章:

  

因此,由于更改隔离级别不是ormsettings中可用的设置之一,因此我必须创建一个自定义的hibernate配置文件。

     

起初我认为这很难,因为我认为我必须插入所有&#34;标准&#34;设置hibernate的Coldfusion实现已经在使用,但事实证明,你只需要设置你想要使用的任何其他属性。以下是可用的hibernate配置选项列表。

     

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html

     

所以,对某些代码......

     

这是我新创建的hibernate配置文件。

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<!-- a SessionFactory instance listed as /jndi/name -->

<session-factory

name="java:hibernate/SessionFactory">

<!-- properties -->

<property name="connection.isolation">1</property>

</session-factory>

</hibernate-configuration>
     

注意配置文件中的一件事。 <property name="connection.isolation">1</property>。为什么你要问...

     

以下是每个可用隔离级别的int值。

java.sql.Connection
public static final int   TRANSACTION_NONE                0
public static final int   TRANSACTION_READ_COMMITTED      2
public static final int   TRANSACTION_READ_UNCOMMITTED    1
public static final int   TRANSACTION_REPEATABLE_READ     4
public static final int   TRANSACTION_SERIALIZABLE        8
     

来源:http://java.sun.com/j2se/1.5.0/docs/api/constant-values.html#java.sql.Connection.TRANSACTION_READ_COMMITTED

     

然后在我的application.cfc中设置

<cfset this.ormsettings = {dialect="MicrosoftSQLServer", ormconfig="hibernate.xml"}>  
     

现在,请确保在webroot之外的某处有hibernate.xml文件,以防止被任何邪恶的眼睛读取。

     

你去了,希望这对你有所帮助,因为我花了很多时间去挖掘它

Curt Gratz对此信息完全赞同。
 如果将来删除该页面,请重新发布此处。