课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习计算机编程开发技术,本文我们就通过案例分析来简单了解一下,数据库事务隔离级别与应用分析。
SQL标准定义了四种隔离级别,这四种隔离级别分别是:
读未提交(READUNCOMMITTED):在这种隔离级别下,可能会出现脏读、不可重复读、幻读问题。
读提交(READCOMMITTED):解决脏读问题。
可重复读(REPEATABLEREAD):解决脏读、不可重复读问题。
串行化(SERIALIZABLE):解决脏读、不可重复读、幻读问题。
可重复读也经常用在数据库备份过程中,由于数据库备份时数据还有可能在不断修改,我们肯定希望备份整个数据库开始时的那个版本,而不希望备份的数据有些是之前那个时刻版本的,有些则是之后那个时间版本的。
我们可以不从赃读,不可重复读,幻读这些现象看事务隔离级别,而是从读一致性上来理解,如下:
未提交读,不解决任何读一致性问题,只保证了事务的写一致性(又称原子性),事务提交后,要么都修改成功,要么都不成功。
提交读,保证其它并发事务的修改要么全可见,要么全不可见,可以理解为"写一致性读",注意断句!"写一致性"、"读",这是常用的事务隔离级别,可以保证业务数据含义的一致性。
比如用户下单场景,开事务先后写了order主表订单数据与order_item子表订单中商品数据,如果在两个写中间,有一个未提交读的事务,去读取order与order_item,就会发现只读到了order而没有读到order_item,这给用户看到了,那一定会吓一跳的,我交钱了结果买了一个空单!虽然用户刷新一下又可以看到完整数据。
但如果使用提交读事务隔离级别就不会有这个问题,用户要么查不到任何数据,要么查到完整数据,这也从侧面说明了逻辑上有关联的数据修改,一定要开事务来操作。
可重复读,保证事务开启或一次查询那一刻,后面所有对整个数据库所有表的读都是读那一刻的版本,当然包括重复读同一张表,也可以理解为"一致版本读"。
串行化,一般来说解决的是并发上的逻辑错误,因为此级别逻辑上可以认为所有事务都是串行执行的(虽然数据库实际上可能会并发执行)。
比如两个事务先判断数据有没有,没有则插入数据的场景,并发情况下两个事务同时查询,发现没有数据后插入数据,结果插入了两条数据,而使用串行化隔离级别就没有这个问题,这在并发编程中叫竞态条件,所以串行化解决了读写的竞态条件问题。
当然,这个问题也可以通过添加索引,或使用外部显示加锁的方法来解决。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。