有小伙伴问到关于事务并发安全的问题,接下来就带大家一起探索一下
首先,我们需要 知道 事务并发安全问题 出现的场景是什么:
在数据库系统中,事务安全是指在多个用户并发访问数据库时,保证所有的数据操作都是安全和正确的。具体来说,就是要防止多个事务同时对同一数据进行修改时,互相干扰或者出现数据不一致的情况。通俗易懂的来说就是每一个修改数据库的请求,我们都要保证这个数据是正确修改,不会被其他请求所干扰自己的数据。
造成事务安全的场景有哪些?
1. 脏读: 就是一个事务在读取这一行数据,此时另一个事务修改了这一行数据,但是这个修改的事务还没有提交,那么就会造成正在读的这个事务读取到的数据是脏数据,更可怕的就是如果第一个事务此时把这个数据修改了,那么就会发生错误,因为此时修改的数据就是个脏数据。
2.幻读: 当第一个事务进行查询操作的时候,此时另一个事务将数据修改或者添加了,那么第一个事务进行二次查询的时候会发现两次查询的数据不一致,它其实和脏读是很像的。
3.一类丢失更新问题:当多个事务同时修改一个数据的时候,可能会造成数据的覆盖和丢失。比如说:两个事务同时添加存款,那么有可能造成数据覆盖,而导致存款的总额计算错误。
4.二类更新丢失问题:当多个事务并发的操作同一个数据,那么会有多个事务进行操作,但是最终只有一个事务提交成功,其他事务失败被回滚,这种情况下,可能会导致其他事务对数据做出的修改被回滚从而数据被丢失了,因为数据库只会保留事务成功提交所做出的更改。
什么是并发事务控制?
并发事务控制是一种用于处理并发事务的技术。当多个事务同时进行时,我们需要如何协调它们的执行,保证它们之间的数据操作是正确的并且不会相互干扰。常用的并发事务控制技术包括锁定和隔离性等级。
我们之前提到的事务隔离等级可以避免上述场景,这里我们再进行回忆一下:
1.读未提交 : 写的时候会阻塞写,但不会阻塞读,所以不能解决脏读和幻读,但是阻塞写了,所以可以解决一类丢失更新问题。
2.读已提交:写的时候会把读和写都阻塞了,可以解决脏读和幻读以及一类丢失更新问题。
3.可重复读:事务读的时候会阻塞写,在写的时候会将读和写都阻塞,可以解决脏读,幻读,一类丢失问题和二类丢失问题。
4.串行化:将事务按顺序执行,使用的是表锁,所以可以解决一切事务安全问题,但是效率非常慢。
在选择隔离级别时,我们需要根据具体的业务需求和数据操作情况进行权衡,选择合适的隔离级别来保证事务的安全性和效率。
总结:
事务安全问题是数据库系统中非常重要的一个方面,我们需要采取一系列的措施来协调并发事务的执行,避免出现数据的不一致性问题。特别是在高并发场景下,事务安全的问题更显得尤为重要。我们可以通过锁定和隔离性等级的技术,来保证事务的安全性和准确性,从而确保系统的稳定性和可靠性。