事务

    xiaoxiao2022-07-02  129

    设置事务不自动提交的时候,查询也会开启事务;

    READ COMMITED的时候:

    (读写不互斥)(在自身事务,每次读都是读到数据最近一次提交的状态,所以)

    一个写的时候另外一个可以读,在第一个事务没有提交之前,第二个事务读到的是第一个事务修改之前的数据,在第一个事务提交后,第二个事务读到的是第一个事务修改后的数据。

    这也是不可重复读产生的原因。

    一个读的时候另外一个可以写数据,

    (写写互斥)一个事务在更新某条数据,另外一个事务只有等待前一个事务提交才能更新该数据。

     

    REPEATABLE READ :

    (读写不互斥)(在自身事务,第一次读数据的时候,读到的是该数据最近一次提交的状态,此后每次读数据都和第一次的数据保持一致,不论期间数据被其他事务修改提交了多少次。原理是通过,数据库的多版本并发控制(MVCC)实现,具体看下文(后面的文字和图片)。只有当自身事务本身提交后,才能读到新的其他事务提交的数据)

    一个事务读的时候,另外一个事务修改并提交了事务,那么第一个事务反复读同一条数据读到的都是第二个事务修改之前的数据。只有当第一个事务提交后,才能读到第二个事务修改的数据。

    也就是说第一个事务读同一条数据读到的都是一样的,就是它第一次读该数据时,该数据的状态,即便这时候有其他事务修改并提交了事务。只有当第一个事务提交后,才能读取到最新的数据。一个事务写的时候,另外一个事务只能读到第一个事务写之前的数据,当第一个事务提交后,第二个事务读到的仍然是第一个事务写之前的数据。只有当第二个事务自身提交后,才能读到第一个事务提交后的数据。

    (写写互斥)

    一个事务在更新某条数据,另外一个事务只有等待前一个事务提交才能更新该数据。

     

    串行化:(读写互斥,写读互斥,写写户次,读读不互斥)

     

    隔离级别的实现原理

    使用MySQL的默认隔离级别(可重复读)来进行说明。

    每条记录在更新的时候都会同时记录一条回滚操作(回滚操作日志undo log)。同一条记录在系统中可以存在多个版本,这就是数据库的多版本并发控制(MVCC)。即通过回滚(rollback操作),可以回到前一个状态的值。

    假设一个值从 1 被按顺序改成了 2、3、4,在回滚日志里面就会有类似下面的记录。

     

    最新回复(0)