多个事务同时执行时带来的问题
1. 更新丢失
複数のトランザクションが同じ行を選択し、その行の元の値を更新すると発生する。
トランザクションは互いに相手を意識することがないので、
ある更新処理による更新データが確定される前に、他の更新処理により変更されてしまうと、
前者のトランザクションで更新したデータが失われてしまうことになる。
当两个事务读取同一个行,其中一个事物导致该行的数据更新的时候发生
在一个事务更新数据还未提交,另外一个事务对该行数据进行更新并提交后,将会导致先提交的事务所做的更新丢失。
2. 脏读
別のトランザクションにより更新されたが、まだコミットされていないデータを読んでしまえる。
後者のトランザクションが読み取るデータは、まだコミットされていないので、
行を更新中のトランザクションによって変更される可能性がある。
これはトランザクション処理における機能の条件である「ACID特性」のうち
「C」の文字で表されている「一貫性」(Consistency)と矛盾する。
ダーティーリードを禁止することは比較的容易に実現できるが、
多くの場合、禁止を実行するとオーバーヘッドを生じさせてしまうことになり、
アプリケーションの実行速度を低下させてしまう。同様に、システムの平行性を低下させてしまうことも多い。
读取到被别的事务更新但没有提交的数据。
因为读到的是别的事务还没有提交的数据,所有有被的事务更新的可能性。这和关于事务处理机能所诉的[ACID]特性的[C],也就是[一贯性(Consistency)相矛盾。虽然禁止脏读很容易实现,但大多数场合下,禁止脏读会产生额外的开销,导致应用的执行速度降低。同样的,也常会导致系统并行性降低。
3. 反复读取不一致
トランザクション中に、繰り返し同じデータを参照するとき、そのつど値が変わってしまう状態。
同一トランザクション内で、同じSELECT文が実行された場合に、同じ照会結果が保証されないことを言う。
反復不能読み取りは、トランザクションがデータを変更中に別のトランザクションがそのデータを読み取るという点で
ダーティリードと似ている。ただし反復不能読み取りの場合、別のトランザクションが読み取るデータは
変更を行ったトランザクションによってコミットされている。また、同じ行が複数回読み取られ、
そのたびにトランザクションによって情報が変更される。そのため、反復不能読み取りと呼ばれる。
在事务中,反复读取同一数据的时候,在每次读取的时候值发生变化。
在同一个事务中,同一个SELECT语句执行的场合,不能保证查询结果都是一样的。
不能反复读取,关于在事务中数据被修改过程中被别的事务读取的点来说,和脏读很像。但是不能反复读的情况下,别的事务读取的时当前事务所提交的数据,别的事务针对同一数据被多次读取的情况,在每次读取数据时会应为当前事务的提交而发生变化,因此被称作不能反复读取。
4. 幻读
トランザクション中に、突然現れたり消えたりしてしまうデータができてしまう。
その様子から、この現象はファントムと呼ばれる。
同一トランザクション内で、同じSELECT文を実行した場合に、
別のトランザクションで削除が行われた場合、2回目以降の読み取りにおいて、
最初の読み取りで得られた行のデータが得られなくなったり、
別のトランザクションで挿入が行われた場合、2回目以降の読み取りにおいて、
最初の読み取りで得られなかった行のデータが読み取られてしまう。
在一个事务中,突然出现或消失数据的现象被称作幻读。
同一个事务中,最初读取到的数据被别的事务删除,在第2次用相同的SELECT语句却读取不到。或者说最初没有读取到的数据,因为别的事务的插入操作导致第2次却读取到。