mysql怎么解决脏读问题

mysql怎么解决脏读问题

操作方法

  • 01

    1.所谓的脏读就是指一个事务读取了另一个事务未提取的数据。 例如:a账户要给b账户100元购买商品,如果a账户开启一个事务,执行下面的update语句做了如下转账的工作。 update account set money=money-100 where name='a'; update account set money=money+100 where name='b'; 这里我们开启了两个命令行窗口(相当于开启两个线程),分别模拟a账户和b账户

  • 02

    2.设置b账户中事务的隔离级别 大家都知道MySQL的默认隔离级别是Repeatable Read(可重复读),该级别是可以避免脏读的,因此需要将b账户中事务的隔离级别设置为Read Uncommitted(读未提交),具体语句如下: set session transaction isolation level read uncommitted;

  • 03

    3.session表示当前会话,transaction就表示事务,isolation表示隔离,level表示级别,read uncommitted表示当前的隔离级别,该语句执行成功之后,使用select语句查询事务的隔离级别,结果如下: select @@tx_isolation;

  • 04

    4. 可以看出b账户的事务隔离级别以及修改为Read Uncommitted。 脏读的演示: b账户:为了证明出现了脏读的情况,首先在b账户中开户一个事务,并在该事务中查询当前账户的余额信息,查询结果如下: start transaction; select * from account;

  • 05

    5. a账户:在a账户中开启一个事务,并在当前窗口中执行转账功能 start transaction; update account set money=money-100 where name='a'; update account set money=money+100 where name='b';

  • 06

    6.b账户:a账户执行完转账语句后,b账户查询当前账户,因此才读取了a账户还没有提交的数据内容,出现了脏读的情况,这时候,b误以为a账户以及转账成功,便会给a发货,当b发货之后a如果不提交事务将事务回滚,b就会受到损失。

(0)

相关推荐