达州高端网站建设,十堰企业网站制作公司,网站功能描述书须包含哪些内容,网站建设和挂标情况清理表1. 脏读所谓的脏读就是指一个事务读取了另一个事务未提取的数据。试想一下#xff1a;a账户要给b账户100元购买商品#xff0c;如果a账户开启一个事务#xff0c;执行下面的update语句做了如下转账的工作#xff1a;update account set moneymoney-100 where namea;update …1. 脏读所谓的脏读就是指一个事务读取了另一个事务未提取的数据。试想一下a账户要给b账户100元购买商品如果a账户开启一个事务执行下面的update语句做了如下转账的工作update account set moneymoney-100 where namea;update account set moneymoney100 where nameb;如果a账户先不提交事务通知b账户来查询由于b的隔离级别比较低此时就会读取a事务中未提交的数据发现a确实给自己转了100元然后给a发货等b发货成功之后a再将事务回滚此时b就会受到损伤这就是脏读造成的。为了演示上面的情况这里我们开启了两个命令行窗口(相当于开启两个线程)分别模拟a账户和b账户如下(1)设置b账户中事务的隔离级别大家都知道MySQL的默认隔离级别是Repeatable Read(可重复读)该级别是可以避免脏读的因此需要将b账户中事务的隔离级别设置为Read Uncommitted(读未提交)具体语句如下set session transaction isolation level read uncommitted;如下上述语句之中session表示当前会话transaction就表示事务isolation表示隔离level表示级别read uncommitted表示当前的隔离级别该语句执行成功之后使用select语句查询事务的隔离级别结果如下select tx_isolation;如下从上述结果可以看出b账户的事务隔离级别以及修改为Read Uncommitted接下来就是演示脏读的情况2)演示脏读b账户为了证明出现了脏读的情况首先在b账户中开户一个事务并在该事务中查询当前账户的余额信息查询结果如下start transaction;select * from account;如下a账户在a账户中开启一个事务并在当前窗口中执行转账功能具体语句如下start transaction;update account set moneymoney-100 where namea;update account set moneymoney100 where nameb;如下需要注意的是此时不要提交事务如果提交事务就无法演示出现脏读的情况。b账户a账户执行完转账语句后b账户查询当前账户如下从上面的查询结果来看a账户已经成功给b账户转账了100元这是由于b账户的事务隔离级别比较低因此才读取了a账户还没有提交的数据内容出现了脏读的情况这时候b误以为a账户以及转账成功便会给a发货当b发货之后a如果不提交事务将事务回滚b就会受到损失。上面演示完毕了需要将a账户中的事务回滚b账户中的事务提交。(3)设置b账户的事务隔离级别为了防止脏读发生可以将b账户中的事务隔离级别设置为Read Committed(读提交)该级别会避免脏读具体语句如下set session transaction isolation level read committed;上述的语句执行成功之后b账户的隔离级别已经设置成Read Committed(4)验证是否出现脏读b账户为了说明没有出现脏读的情况首先要在b账户中开启一个事务并在该事务中查询各账户的余额情况查询结果如下a账户在a账户中重新开启一个事务实现了转账功能如下start transaction;update account set moneymoney-100 where namea;update account set moneymoney100 where nameb;b账户当a 账户转账成功之后可以在b账户中再次查询各账户的余额信息查询结果如下通过上面的对比两次查询结果可以发现b账户在同一个事务中的查询结果是一致的并没有查询到a账户中未提交的内容因此可以说明Read Committed 隔离级别可以避免脏读最后分别将a账户和b账户中的事务回滚.