
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据库架构开发是大多数后端编程开发程序员都应该熟练掌握的一个编程技术,而本文我们就通过案例分析来简单了解一下,数据库架构常出现的并发一致性问题分析。
丢失修改:一个事务对数据进行了修改,在事务提交之前,另一个事务对同一个数据进行了修改,覆盖了之前的修改。
例如:事务A把变量a的值从5修改到10,还未提交时另一个事务B又把变量a的值修改为15并成功提交,然后事务A提交,后变量a的值还是10。相当丢失了事务B的这次修改。
脏读:一个事务读取了被另一个事务修改、但未提交(有可能进行了回滚)的数据,造成两个事务得到的数据不一致。
例如:事务A修改变量a的值为10,但未提交。此时事务B读取变量a的值为10,然后进行操作。但是事务A之后进行了回滚,变量a的值变回了5。相当于事务B读取到变量错误的值,即读取了脏数据。
不可重复读:在同一个事务中,查询操作在某个时间读取某一行数据和之后一个时间读取该行数据,发现数据已经发生修改(针对的update操作)。
例如:计算变量a+变量a,前面那个a读取的值是50,后面那个读取到的值是100。
幻读:当同一查询多次执行时,由于其它事务在这个数据范围内执行了插入操作,会导致每次返回不同的结果集。(和不可重复读的区别:幻读针对一个数据整体/范围,并且针对的是insert操作)。
数据库的隔离级别
未提交读(ReadUncommited):在一个事务提交之前,它的执行结果对其它事务也是可见的。会导致脏读、不可重复读、幻读。(比如某程序更新数据,但是并没有提交,别的程序就可以读取到它。)
该级别下,select语句不加锁,虽然并发性高,但是隔离性差,所以该隔离级别一般不会被使用。
提交读(ReadCommited):一个事务只能看见已经提交的事务所作的改变。可避免脏读问题。
可重复读(RepeatableRead):可以确保同一个事务在多次读取同样的数据时得到相同的结果。可以理解为事务在读取数据的时候获取了一次当前时刻数据的快照,后续的读取都以快照为参照,所以不受其余事务的影响。但是该隔离级别可能会导致幻读,后续在讲解MVCC的时候会说明不能避免幻读的理由。
MySql默认隔离级别。可避免脏读、不可重复读的发生。
可串行化(Serializable):强制事务串行执行,使之不可能相互冲突,从而解决幻读问题。每次读都需要获得表级共享锁,读写相互都会阻塞。
虽然可以避免脏读、不可重复读、幻读的发生。但是因为可能导致大量的超时现象和锁竞争,实际很少使用。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。