事物

事物
1.脏读
a事物中修改了name数据,为提交。
b事物读取了name数据。
a事物回滚。
b事物读取的name数据为错误数据。

2.不可重复读
a事物第一次读取name。
b事物修改/删除了name。
a事物再次读取name。
a事物前后两次读取的name不一样。

3.幻读
a事物第一次读取name=’xiao’的数据。
b事物插入了name=’xiao’的新数据。
a事物再次读取name=’xiao’的数据。
a事物前后两次读取的name=’xiao’不一样。

Spring事务
传播行为
spring特有的事务传播行为,spring支持7种事务传播行为,确定客户端和被调用端的事务边界(说得通俗一点就是多个具有事务控制的service的相互调用时所形成的复杂的事务边界控制)
method1(){ method2()}
REQUIRED:业务方法需要在一个事务中运行,如果被调用端发生异常,那么调用端和被调用端事务都将回滚。
method2的事物传播属性为REQUIRED,
结果:如果method1在事物a中运行,则method2会加入事物a中。如果method1没有在事物中运行,则method2会为自己创建一个事物。

    NOT_SUPPORTED:声明方法不需要事务。method2的事物传播属性为NOT_SUPPORTED,
    结果:如果method1在事物a中运行,则到method2时,事务a会被挂起会,method2结束后,事务a恢复执行。如果method1没有在事物中运行,则method2不会再开启一个事物。

    REQUIRESNEW:该属性表明不管当前是否存在事务,业务方法总会为自己发起一个新的事务。method2的事物传播属性为REQUIRESNEW,
    结果:method1在事物a中运行,则到method2时,事务a会被挂起会,method2为自己新建一事物b,method2结束后,事物b结束,事务a恢复执行。
    如果method1没有在事物中运行,则method2新开启一个事物b。

    MANDATORY:该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。
    SUPPORTS:这一事务属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。method2()的事物传播属性为SUPPORTS,
    结果:如果method1开启事物a,method2()则加入事物a,如果method1没有在事物中,method2()则也不在事物中执行。

    Never:指定业务方法绝对不能在事务范围内执行。method2()的事物传播属性为Never,
    结果:如果method1开启事物a,执行到method2()时则抛出异常。

    NESTED:如果一个活动的事务存在,则当前方法运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。
    内部事务的回滚不会对外部事务造成影响。method2()的事物传播属性为NESTED,
    结果:如果method1开启事物a,method2()则将开启事物b,嵌套到事物a中。如果method1没开启事物,则创建事物b。

隔离级别
隔离级别定义一个事务可能受其他并发事务活动活动影响的程度。另一种考虑一个事务的隔离级别的方式,是把它想象为那个事务对于事物处理数据的自私程度。
ISOLATION_DEFAULT 使用后端数据库默认的隔离级别。
ISOLATION_READ_UNCOMMITTED 允许读取尚未提交的更改。可能导致脏读、幻影读或不可重复读。
ISOLATION_READ_COMMITTED 允许从已经提交的并发事务读取。可防止脏读,但幻影读和不可重复读仍可能会发生。
ISOLATION_REPEATABLE_READ 对相同字段的多次读取的结果是一致的,除非数据被当前事务本身改变。可防止脏读和不可重复读,但幻影读仍可能发生。
ISOLATION_SERIALIZABLE 完全服从ACID的隔离级别,确保不发生脏读、不可重复读和幻影读。这在所有隔离级别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。

@TransactionDefinition:
TransactionDefinition.ISOLATIONDEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别。比如PostgreSQL实际上并没有此级别。
TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。
该级别可以防止脏读,这也是大多数情况下的推荐值。
TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。
该级别可以防止脏读和不可重复读。
TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值