事务并发导致的问题
1.脏读:事务A读取了事务B(未提交)更新的数据,然而B事务回滚了。
2.不可重复读:事务A多次读取同一数据时,事务B(已提交)对这一数据进行了修改,导致事务A读取数据前后不一致。
3.幻读:事务A读取某个特定条件的数据行数为n,此时事务B插入了几行新的数据后,事务A重新读取数据行数为m(m != n)
事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
读已提交 (read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化 (serializable) | 否 | 否 | 否 |
RC
数据的读取都是不加锁的,但是数据的写入、修改和删除是需要加锁
RR
通过MVCC实现,通过在每行数据中添加额外的隐藏值(数据版本号,删除时间,指向undo log的指针)。事务开始时生成版本号,在读取数据时,只能读取到小于等于改版本号的数据
串行化
通过悲观锁(读加共享锁,写加排他锁,读写互斥)来实现