mariadb/mysql-test/suite/gcol/r
Marko Mäkelä b8a6719889 MDEV-26642/MDEV-26643/MDEV-32898 Implement innodb_snapshot_isolation
https://jepsen.io/analyses/mysql-8.0.34 highlights that the
transaction isolation levels in the InnoDB storage engine do not
correspond to any widely accepted definitions, such as
"Generalized Isolation Level Definitions"
https://pmg.csail.mit.edu/papers/icde00.pdf
(PL-1 = READ UNCOMMITTED, PL-2 = READ COMMITTED, PL-2.99 = REPEATABLE READ,
PL-3 = SERIALIZABLE).
Only READ UNCOMMITTED in InnoDB seems to match the above definition.

The issue is that InnoDB does not detect write/write conflicts
(Section 4.4.3, Definition 6) in the above.

It appears that as soon as we implement write/write conflict detection
(SET SESSION innodb_snapshot_isolation=ON), the default isolation level
(SET TRANSACTION ISOLATION LEVEL REPEATABLE READ) will become
Snapshot Isolation (similar to Postgres), as defined in Section 4.2 of
"A Critique of ANSI SQL Isolation Levels", MSR-TR-95-51, June 1995
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf

Locking reads inside InnoDB used to read the latest committed version,
ignoring what should actually be visible to the transaction.
The added test innodb.lock_isolation illustrates this. The statement
	UPDATE t SET a=3 WHERE b=2;
is executed in a transaction that was started before a read view or
a snapshot of the current transaction was created, and committed before
the current transaction attempts to execute
	UPDATE t SET b=3;
If SET innodb_snapshot_isolation=ON is in effect when the second
transaction was started, the second transaction will be aborted with
the error ER_CHECKREAD. By default (innodb_snapshot_isolation=OFF),
the second transaction would execute inconsistently, displaying an
incorrect SELECT COUNT(*) FROM t in its read view.

If innodb_snapshot_isolation=ON, if an attempt to acquire a lock on a
record that does not exist in the current read view is made, an error
DB_RECORD_CHANGED (HA_ERR_RECORD_CHANGED, ER_CHECKREAD) will
be raised. This error will be treated in the same way as a deadlock:
the transaction will be rolled back.

lock_clust_rec_read_check_and_lock(): If the current transaction has
a read view where the record is not visible and
innodb_snapshot_isolation=ON, fail before trying to acquire the lock.

row_sel_build_committed_vers_for_mysql(): If innodb_snapshot_isolation=ON,
disable the "semi-consistent read" logic that had been implemented by
myself on the directions of Heikki Tuuri in order to address
https://bugs.mysql.com/bug.php?id=3300 that was motivated by a customer
wanting UPDATE to skip locked rows that do not match the WHERE condition.
It looks like my changes were included in the MySQL 5.1.5
commit ad126d90e019f223470e73e1b2b528f9007c4532; at that time, employees
of Innobase Oy (a recent acquisition of Oracle) had lost write access to
the repository.

The only reason why we set innodb_snapshot_isolation=OFF by default is
backward compatibility with applications, such as the one that motivated
the implementation of "semi-consistent read" back in 2005. In a later
major release, we can default to innodb_snapshot_isolation=ON.

Thanks to Peter Alvaro, Kyle Kingsbury and Alexey Gotsman for their work
on https://github.com/jepsen-io/ and to Kyle and Alexey for explanations
and some testing of this fix.

Thanks to Vladislav Lesin for the initial test for MDEV-26643,
as well as reviewing these changes.
2024-03-20 09:48:03 +02:00
..
federated_gcol.result
gcol_archive.result
gcol_blackhole.result
gcol_blocked_sql_funcs_innodb.result MDEV-19071 Wrong results when using STDDEV_SAMP() and view 2023-01-02 00:04:03 +01:00
gcol_blocked_sql_funcs_myisam.result MDEV-19071 Wrong results when using STDDEV_SAMP() and view 2023-01-02 00:04:03 +01:00
gcol_bug20746926.result
gcol_bugfixes.result Merge branch '10.4' into 10.5 2023-12-02 01:02:50 +01:00
gcol_column_def_options_innodb.result Merge 10.5 into 10.6 2022-12-13 16:58:58 +02:00
gcol_column_def_options_myisam.result Merge 10.5 into 10.6 2022-12-13 16:58:58 +02:00
gcol_csv.result
gcol_falcon.result
gcol_handler_innodb.result
gcol_handler_myisam.result
gcol_ins_upd_innodb.result Merge branch '10.4' into 10.5 2021-07-31 23:19:51 +02:00
gcol_ins_upd_myisam.result Merge branch '10.4' into 10.5 2021-07-31 23:19:51 +02:00
gcol_keys_innodb.result Merge 10.5 into 10.6 2022-09-20 16:53:20 +03:00
gcol_keys_myisam.result Merge 10.5 into 10.6 2022-09-20 16:53:20 +03:00
gcol_memory.result
gcol_merge.result
gcol_ndb.result
gcol_non_stored_columns_innodb.result MDEV-29446 Change SHOW CREATE TABLE to display default collation 2022-09-12 22:10:39 +04:00
gcol_non_stored_columns_myisam.result MDEV-29446 Change SHOW CREATE TABLE to display default collation 2022-09-12 22:10:39 +04:00
gcol_partition_innodb.result MDEV-32050 fixup: Stabilize tests 2023-11-21 12:42:00 +02:00
gcol_partition_myisam.result MDEV-26220 Server crashes with indexed by prefix virtual column 2021-08-02 10:31:22 +02:00
gcol_purge.result MDEV-32050 fixup: Stabilize tests 2023-11-21 12:42:00 +02:00
gcol_rejected_innodb.result
gcol_rollback.result MDEV-30597 Assertion `flag == 1' failed in row_build_index_entry_low 2023-02-14 14:28:27 +05:30
gcol_select_innodb.result Merge 10.4 into 10.5 2022-07-27 17:17:24 +03:00
gcol_select_myisam.result Merge 10.5 into 10.6 2022-07-27 17:52:37 +03:00
gcol_supported_sql_funcs_innodb.result MDEV-29446 Change SHOW CREATE TABLE to display default collation 2022-09-12 22:10:39 +04:00
gcol_supported_sql_funcs_myisam.result MDEV-29446 Change SHOW CREATE TABLE to display default collation 2022-09-12 22:10:39 +04:00
gcol_trigger_sp_innodb.result
gcol_trigger_sp_myisam.result
gcol_update.result MDEV-32050 fixup: Stabilize tests 2023-11-21 12:42:00 +02:00
gcol_view_innodb.result MDEV-4750 follow-up: Reduce disabling innodb_stats_persistent 2021-08-31 13:55:02 +03:00
gcol_view_myisam.result MDEV-4750 follow-up: Reduce disabling innodb_stats_persistent 2021-08-31 13:55:02 +03:00
innodb_partition.result
innodb_prefix_index_check.result MDEV-13626 Merge InnoDB test cases from MySQL 5.7 2023-11-08 12:17:14 +02:00
innodb_virtual_basic.result MDEV-18114 Foreign Key Constraint actions don't affect Virtual Column 2023-08-02 14:45:31 +02:00
innodb_virtual_blob.result
innodb_virtual_debug.result MDEV-32050 fixup: Stabilize tests 2023-11-21 12:42:00 +02:00
innodb_virtual_debug_purge.result MDEV-26642/MDEV-26643/MDEV-32898 Implement innodb_snapshot_isolation 2024-03-20 09:48:03 +02:00
innodb_virtual_fk.result Merge 10.3 into 10.4 2022-09-13 16:36:38 +03:00
innodb_virtual_fk_restart.result
innodb_virtual_index.result MDEV-32050: Deprecate&ignore innodb_purge_rseg_truncate_frequency 2023-10-25 09:11:58 +03:00
innodb_virtual_purge.result MDEV-32050 fixup: Stabilize tests 2023-11-21 12:42:00 +02:00
innodb_virtual_rebuild.result
innodb_virtual_stats.result
innodb_wl8114.result
main_alter_table.result
main_mysqldump.result
rpl_gcol.result MDEV-29446 Change SHOW CREATE TABLE to display default collation 2022-09-12 22:10:39 +04:00
virtual_index_drop.result Merge 10.3 into 10.4 2022-09-13 16:36:38 +03:00