Opened 7 years ago
Last modified 6 years ago
#28901 new Cleanup/optimization
Document considerations with read committed isolation level and InnoDB
Reported by: | Dirkjan Ochtman | Owned by: | nobody |
---|---|---|---|
Component: | Documentation | Version: | 2.0 |
Severity: | Normal | Keywords: | |
Cc: | Adam Johnson | Triage Stage: | Someday/Maybe |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
After upgrading my application to Django 2.0, I have been seeing errors: "Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED."
The 2.0 release notes at https://docs.djangoproject.com/en/2.0/releases/2.0/#default-mysql-isolation-level-is-read-committed don't mention anything about this particular problem. Since, as far as I can tell, InnoDB and BINLOG_FORMAT = STATEMENT are the default values, it would be useful if the documentation could warn about this problem.
Change History (5)
comment:1 by , 7 years ago
Cc: | added |
---|---|
Summary: | Read committed isolation level does not work with InnoDB → Document considerations with read committed isolation level and InnoDB |
Type: | Uncategorized → Cleanup/optimization |
comment:2 by , 7 years ago
I wouldn't mind typing up the above in a way that is feasible for the documentation -- however, it would sure be nice if someone with deeper knowledge of Django and MySQL reviews that what I'm saying is correct and makes sense, and simply reverting the isolation level is the best solution here. It sure doesn't feel like the right solution -- but I couldn't figure out so far what the best alternative is.
comment:3 by , 7 years ago
Triage Stage: | Unreviewed → Someday/Maybe |
---|
comment:4 by , 6 years ago
Hi, I encountered a related issue and opened (and later answered) a stackoverflow question I think may be useful for others stumbling upon this ticket, so I'm linking it here: https://stackoverflow.com/a/51399292/1146713
The gist of it is I was using an old MariaDB version (10.0) which defaulted to BINLOG_FORMAT = STATEMENT
instead of the more flexible BINLOG_FORMAT = MIXED
that is the default since version 10.2.4.
Django may want to add that as part of the default-override, to avoid this problem when working with older versions of MariaDB, or include as part of the documentation section about changing the default transaction isolation level. I have no opinion on the matter but I'm up to contribute a change once it's decided.
comment:5 by , 6 years ago
Django can't override binlog_format since it is set on the server level only, which requires either super privilege (django apps shouldn't have this) or editing the config file. Also it has a huge number of considerations, see https://mariadb.com/kb/en/library/binary-log-formats/ .
Would you like to draft something?