spring事务
事务属性的种类:
1传播行为,2隔离级别,3只读和事务超时。
传播行为定义了被调用方法的事务边界
1传播行为和它的意义:
p..._required(必须的):必须要有一个事务,没有则新建一个事务
p..._required_new:必须新建事务,如果当前存在事务,把当前事务挂起
propergation_mandatory(强制的),方法必须运行在一个事务中,没有事务就抛异常
propergation_nested(嵌套),方法应当运行在一个嵌套事务中
propergation_never(绝不),绝不能有事务,否则抛异常
p。。_supported(支持),当支持(使用)当前事务,如果不存在事务就不使用事务,没有事务就以非事务方式执行
p.._not_suppprted,不支持事务,存在事务则方法被挂起
2隔离级别
操作数据时可能带来三个副作用,分别是脏读,不可重复读,幻读
脏读:举个例子,如果你正在读数据库内容,而我现在修改了数据库内容还没有提交,接着我修改后的内容没有提交的情况下被你读到了,就叫脏读.
不可重复读:举个例子,比如你正在读数据库内容,而我update数据库后提交了,你又读了一次数据库内容,这时出现两个内容不同的结果,这叫不可重复读.
幻读:举个例子,比如你正在读数据库内容,而我insert数据库后提交了,你又读了一次数据库内容,这时你看到内容出现了多一条数据,这叫幻读.
为了避免这三种副作用,sql语句定义了4种隔离级别,分别是未提交读,已提交读,可重复读,可序列化。
spring事务中提供了五种隔离级别来对应sql中的4种隔离级别
隔离级别——意义:
isolation_default:使用后端数据库默认的隔离级别
i_uncommitted:允许读取未提交的数据(对应未提交读),可能导致脏,幻,不可重复
i_committed:允许读取已经提交的数据(对应已提交读),防脏读,但无法避免:不可重复读和幻读
i_repeatable_read:一个事务无法更新由另一个事务修改但未提交(回滚)的数据(对应可重复读),但无法避免幻读。
i_serializable:所有事务都在一个执行队列中,依次执行,无法并行(对应可序列化)。可避免脏幻不可重复读。但效率很低。

