ブログの内容は時々変更されます。最初のブログが最新です。他のブログのアドレスは同期していない可能性があります。よく確認してください。
https://blog.zysicyj.top
ダーティ リードは、コミットされていない別のトランザクションからデータを読み取るトランザクションを指します。トランザクション A が特定のデータを変更したが、まだ送信されていないとします。トランザクション B はこのコミットされていないデータを読み取り、その後トランザクション A がロールバックするため、トランザクション B によって読み取られたデータは無効または不整合になります。ダーティ リードはデータの不整合を引き起こす可能性があります。
ファントム読み取りとは、1 つのトランザクションが 2 つのクエリの間に新しいデータを挿入し、最初のトランザクションの 2 つのクエリ結果が矛盾することを意味します。トランザクション A がある範囲のデータをクエリしたときに、トランザクション B がその範囲に一致する新しいデータを挿入し、再度トランザクション A がクエリを実行すると、錯覚のように追加のデータがあることがわかります。ファントム読み取りにより、クエリ結果に不整合が生じる可能性があります。
非反復読み取りとは、トランザクションが同じデータを複数回読み取るときに、他のトランザクションによる変更により、読み取られたデータに一貫性がなくなることを意味します。トランザクション A があるデータを読み込んだ後、トランザクション B がそのデータを変更してコミットし、再度トランザクション A がデータを読み込んだときに、データが変更されていることが判明したとします。反復不可能な読み取りでは、読み取られるデータに不整合が生じる可能性があります。
MySQL は、分離レベルを設定することで、ダーティ リード、ファントム リード、および反復不可能な読み取りの問題を解決します。分離レベルは、トランザクションの可視性と他のトランザクションに対する影響を定義します。
MySQL は 4 つの分離レベルを提供します。
-
「Read Uncommitted」 : 最低レベルのトランザクションは、他のトランザクションのコミットされていないデータを読み取ることができます。これにより、ダーティ リード、ファントム リード、反復不可能な読み取りの問題が発生する可能性があります。
-
「Read Committed」 : トランザクションは他のトランザクションによって送信されたデータのみを読み取ることができるため、ダーティ リードの問題は回避できますが、ファントム リードや反復不可能な読み取りの問題が発生する可能性があります。
-
「反復読み取り」 : トランザクションが同じクエリ内で同じデータを複数回読み取る場合、読み取りデータの一貫性が保証され、反復不可能な読み取りの問題が回避されます。ただし、ファントム読み取りの問題が依然として発生する可能性があります。
-
「串行化(Serializable)」:最高级别,事务按顺序执行,避免了脏读、幻读和不可重复读问题。但会导致并发性能下降,因为事务需要串行执行。
通过设置合适的隔离级别,可以根据具体的业务需求来解决脏读、幻读和不可重复读问题。在MySQL中,可以使用以下语句设置隔离级别:
SET TRANSACTION ISOLATION LEVEL <隔离级别>;
其中,<隔离级别>
可以是READ UNCOMMITTED
、READ COMMITTED
、REPEATABLE READ
或SERIALIZABLE
。
如果您喜欢我的内容,请点击关注
扫码长按关注交流群获取最新消息,免费的面试题手册即将在交流群内推出
公众号
个人微信
本文由 mdnice 多平台发布