当前位置:Gxlcms > 数据库问题 > 数据库的特性和事务的特性

数据库的特性和事务的特性

时间:2021-07-01 10:21:17 帮助过:19人阅读

[glogal | session] transaction isolation level 隔离级别名称; set tx_isolation=’隔离级别名称;

二、Spring七种事务的传播属性,五个隔离级别:

    
七个事务传播属性
         propagation_required -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
         propagation_supports -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
         propagation_mandatory -- 支持当前事务,如果当前没有事务,就抛出异常。
         propagation_requires_new -- 新建事务,如果当前存在事务,把当前事务挂起。
         propagation_not_supported -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
         propagation_never -- 以非事务方式执行,如果当前存在事务,则抛出异常。
         propagation_nested--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与propagation_required类似的操作。
 
            1: PROPAGATION_REQUIRED
            加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务
            比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候,
            ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA
            的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。
            这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被
            提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚
 
            2: PROPAGATION_SUPPORTS
            如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行
 
            3: PROPAGATION_MANDATORY
            必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常
 
            4: PROPAGATION_REQUIRES_NEW
            这个就比较绕口了。 比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,
            那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,
            他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在
            两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,
            如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。
 
            5: PROPAGATION_NOT_SUPPORTED
            当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,
            那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续ServiceA.methodA的事务。
 
            6: PROPAGATION_NEVER
            不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,
            那么ServiceB.methodB就要抛出异常了。
 
            7: PROPAGATION_NESTED
            理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,
            而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。
            而Nested事务的好处是他有一个savepoint。

 

 五种隔离级别
        isolation_default   这是一个platfromtransactionmanager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与jdbc的隔离级别相对应;
        isolation_read_uncommitted  这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
        isolation_read_committed    保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
        isolation_repeatable_read   这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
        isolation_serializable      这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

技术图片

 

数据库的特性和事务的特性

标签:读取   其他   action   commit   load   ESS   变换   ali   分配   

人气教程排行