今天是学习计划的第三天,今天打算继续昨天探讨的事务问题。 所以,今天的学习内容是事务特性及隔离问题。 那事务都具有哪些特性呢?
多个线程开启各自事务操作数据库中的数据时,数据库系统要负责隔离操作,以保证各个线程在获取数据时的准确性。如果不考虑隔离,可能会引发如下问题。
update account set money = money - 100 where name = 'a';
update account set money = money + 100 where name = 'b';
当第一条sql语句执行完,第二条还没执行(A未提交时),如果此时B查询自己的账户,就会发现自己多了100元钱,如果A等B走后再回滚,B就会以为转账成功了,但是钱又返还给了A,从而导致B损失100元 脏读被认为是数据库中的最重要问题,是不被任何数据库所允许的。
说完了引发的问题后,我们引出今天的主角,事务隔离级别。 数据库共定义了四种隔离级别:
在Oracle数据库中,默认隔离级别是Read committed 在MySQL数据库中,默认隔离级别是Repeatable read 由此可以发现,基本所有的数据库都不会把隔离级别设置成最高,也不会设置成最低。 因为安全级别越高,处理效率就越低,但是安全级别越低,危害就越大。
在数据库中,可以通过 set transaction isolation level 设置事务隔离级别 select @@tx_isolation 查询当前事务隔离级别 两条语句控制事务隔离级别。 关于隔离级别问题实验,可以参考我的下一篇博客。