事务的安全隐患及隔离级别

事务的安全隐患

          当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,如果不考虑事务的隔离性,会发生以下几种问题:

1、读的问题

(1)脏读:一个事务读到了另一个事务未提交的数据;

        当一个事务正在修改某个数据,而在这个事务中这次修改还未提交,这时另一个事务来访问该数据,就会造成两个事务得到的数据不一致。

(2)不可重复读:一个事务读到了另一个事务已提交的数据,造成了前后两次查询结果的不一致;

        对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

(3)幻读:一个事务读到了另一个事务insert的数据,造成了查询结果不一致。

        一个事务第一次查询时,查到的数据结果,与第二次查询的结果不一致,像是看错了一样。

2、写的问题

(1)丢失更新

        两个事务查询数据库数据,存入对应的缓存中(均未提及),当a事务修改数据后(b事务的数据不变),a事务提交,数据库数据发生第一次改变,之后b事务在原数据(缓存中数据)上修改,提交b事务,则会覆盖a事务的结果,造成a事务更新数据失败,即丢失更新

 

隔离级别

MySQL数据库的四种隔离级别(拦截级别由高到低):

 ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。(级别最高)

 ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

 ③ Read committed (读已提交):可避免脏读的发生。

 ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。(级别最低)

四种隔离级别效率由高到低:

Read uncommitted (读未提交) > Read committed (读已提交) >  Repeatable read (可重复读) >  Serializable (串行化)

 

 

你可能感兴趣的:(Java基础)