Write skew anmalies are found in SERIALIZABLE isolation
When we set the isolation level to
SERIALIZABLE, we observed some wirte skew anmalies.
In order to simplify the problem, suppose
there are only two items, i.e., X and Y, which are initialized with positive values.
The first kind of transactions read X and Y, then write X = X - (X+Y) * 0.9.
The second kind of transactions read X and Y, then write Y = Y - (X+Y) * 0.9.
These transactions execute concurrently. If serializability is
guaranteed, the value of (X+Y) must be a positive number.
In our test, there are two tables, i.e., xtable
and ytable. The values in these two tables are all positive. Each
table has 50 tuples. In our experiments, there are 50 test threads where each
thread establishes a separate
update ytable set ycol = ycol-(X+Y) * 0.9 where id =3;
TRANSACTION ISOLATION LEVEL SERIALIZABLE;
X ß select xcol from xtable where id=3;
Y ß select ycol from ytable where id=3;
xtable set xcol = xcol-(X+Y) * 0.9 where id =3;
At last, we run: select xtable.id from
xtable join ytable using (id) where xtable.xcol + ytable.ycol < 0. Sometimes
the result set is not empty, which means the serializability is violated. We
observe this issue with Test1.java.
If each transaction only read one item with
secondary index and write another item with primary index, write skew anomalies
are more likely to occur.
Re: Write skew anmalies are found in SERIALIZABLE isolation
On 04.10.2019 4:36, 张舒燕 wrote:
have tested versions of 9.4.0, 9.6.0, 10.0, 11.0 and 11.5 and
found the Bug on all of them.
We have wrong statements in the last email.
"If each transaction only read one item with secondary index and write another item with primary index, write skew anomalies are more ( -> less) likely to occur."
"At last, we run the same join SQL, and more ( -> less) anomalies can be found. The corresponding test program is Test2.java."
There are less anomalies can be found in the second
situation using Test2.java.
And some mistakes in our test programs have been fixed.
Best regards ,
Shuyan Zhang, ECNU
I do not think that this problem is somehow related with "write skew
The type of "col" is decimal, but you are extracting it as "double",
making conversion and loosing precision.
Then you perform some manipulations using Java BigDecimal class,
convert result to string (which also does some rounding) and
subtract this value from the column.
As a result of this conversions your original assumption that
(x+y)*0.9 < (x+y) may be wrong.
Please try to reproduce the problem using integer type and I am
almost sure that you will not able to get this anomalies.