We are posting this here for more detail but we will make a call to Adobe for
help since this issue seems like it will require that .
We are experiencing the same issue with a database that has STATEMENT level
logging on.
The issue occurs even when using the MySql Connector/J. CF is somehow still
forcing the value change. It seems CF is hijacking any and all DSN's with
com.mysql.jdbc.Driver. We have even set the default value into the url as an
extra attempt. Adding this name/value pair does nothing to help:
sessionVariables=tx_isolation='READ-COMMITTED'.
The error message is alway:
Binary logging not possible. Transaction level 'READ-COMMITTED' in InnoDB is
not safe for binlog mode 'STATEMENT'
The issue seems to be that the CF datasource manager is forcing tx_isolation
to READ-COMMITTED even when the MySql server global is set to REPEATABLE-READ.
We tested out how this could happen and how we could work around it. The
follow results show the results running SQL direct via Java and then via the
CFQUERY tag. We can see how the global value can be changed and we can change
it. (The code that generated these results also follows)
Java forced @@session.tx_isolation = READ-COMMITTED
Java default @@session.tx_isolation = REPEATABLE-READ
CFQUERY Tag:
@@global.tx_isolation = REPEATABLE-READ
CFQUERY Tag:
@@session.tx_isolation = READ-COMMITTED
After forced with:
SET @@session.tx_isolation = 'REPEATABLE-READ';
@@session.tx_isolation = REPEATABLE-READ
-----------------
Code:
<cfset request.dsn = "xxxxx" />
<cfset request.dbs = "xxxxx:3306" />
<cfset request.user = "xxxxx" />
<cfset request.pass = "xxxxx" />
<cfscript>
oClass = CreateObject("java", "java.lang.Class");
oClass.forName("com.mysql.jdbc.Driver");
oDM = CreateObject("java", "java.sql.DriverManager");
oConn =
oDM.getConnection("jdbc:mysql://#request.dbs#/eln?sessionVariables=tx_isolation=
'READ-COMMITTED'&user=#request.user#&password=#request.pass#");
oRS = oConn.createStatement().executeQuery("SELECT @@session.tx_isolation");
oRS.next();
/* this will force the tx_isolation= to 'READ-COMMITTED' the way the CF
datasource manager is */
strJavaForce = "Java forced @@session.tx_isolation = ";
strJavaForce &= oRS.getObject( oRS.getMetaData().getColumnName(1) );
oConn.close();
/* this will just use the global tx_isolation */
oConn =
oDM.getConnection("jdbc:mysql://#request.dbs#/eln?user=eln&password=eln");
oRS = oConn.createStatement().executeQuery("SELECT @@session.tx_isolation");
oRS.next();
strJavaDefault = "Java default @@session.tx_isolation = ";
strJavaDefault &= oRS.getObject( oRS.getMetaData().getColumnName(1) );
oConn.close();
</cfscript>
<cfquery datasource="#request.dsn#" name="qGlobal">
SELECT @@global.tx_isolation AS tx_i;
</cfquery>
<cfquery datasource="#request.dsn#" name="qSession">
SELECT @@session.tx_isolation AS tx_i;
</cfquery>
<cfquery datasource="#request.dsn#">
SET @@session.tx_isolation = 'REPEATABLE-READ';
</cfquery>
<cfquery datasource="#request.dsn#" name="qSession2">
SELECT @@session.tx_isolation AS tx_i;
</cfquery>
<cfoutput>
<p>
#strJavaForce#
</p>
<p>
#strJavaDefault#
</p>
<p>
CFQUERY Tag:<br />
@@global.tx_isolation = #qGlobal.tx_i#
<BR />
</p>
<p>
CFQUERY Tag:<br />
@@session.tx_isolation = #qSession.tx_i#
</p>
<p>
After forced with:<br />
[I]SET @@session.tx_isolation = 'REPEATABLE-READ';<br />[/I]
@@session.tx_isolation = #qSession2.tx_i#
</p>
</cfoutput>