1.开启事务

事务的四大特性

ACID是原子性(atomicity)一致性(consistency)隔离性 (isolation)和持久性(durability)的缩写。

事务的原子性:事务作为整体执行,要么都成功,要么都回滚。


原子:不可以再次分割 在事务中多条sql 语句,要么都执行成功,有一条失败,其他成功的sql 回滚


事务的一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。


以转账为例:xiaoming 给wangli 转1000 xiaoming 和 wanli 的账户 总额 ,在转账前后不会发生变化 转账成功:xiaoming -1000   wangli +1000 转账失败:金额数据不变


事务的持久性:事务对数据库所做的操作是永久性的。


凡是事务提交的数据,当机器宕机、掉电 重启以后,数据还在,不丢失


事务的隔离性:多个事务在并发执行过程中,是相互独立的(隔离的)比如:售票过程。


隔离性 就是,一个事务能否看读取到另外一个事务未提交的数据


隔离级别

隔离级别:指的就是一个SqlSession 能否看到另外一个SqlSession 事务未提交的数据

隔离级别本质就是我们允许脏数据的程度

java 主动事务 java事务机制_sql

正在上传…重新上传取消

脏数据的程度

问题

描述

脏读

一个事务读取到另一个事务还未提交的数据。大于等于 read-commited 可防止

不可重复读

一个事务内多次读取一行数据的相同内容,其结果不一致。大于等于 repeatable-read 可防止

幻影读

一个事务内多次读取一张表中的相同内容,其结果不一致。serialized-read 可防止

正在上传…重新上传取消

3.1.1 概念

isolation 隔离级别

名称

描述

default

(默认值)(采用数据库的默认的设置) (建议)

read-uncommited

读未提交

read-commited

读提交 (Oracle数据库默认的隔离级别)

repeatable-read

可重复读 (MySQL数据库默认的隔离级别)

serialized-read

序列化读

隔离级别由低到高为:read-uncommited < read-commited < repeatable-read < serialized-read

3.1.2 特性

  • 安全性:级别越高,多事务并发时,越安全。因为共享的数据越来越少,事务间彼此干扰减少。
  • 并发性:级别越高,多事务并发时,并发越差。因为共享的数据越来越少,事务间阻塞情况增多。

3.1.3 并发问题

事务并发时的安全问题

问题

描述

脏读

一个事务读取到另一个事务还未提交的数据。大于等于 read-commited 可防止

不可重复读

一个事务内多次读取一行数据的相同内容,其结果不一致。大于等于 repeatable-read 可防止

幻影读

一个事务内多次读取一张表中的相同内容,其结果不一致。serialized-read 可防止

不可重复读:可以解决更新时数据的一致性

幻影读:可以解决增加,删除数据时的一致性

参考:事务的四种隔离级别 - 吴小凯 - 博客园

传播行为

传播行为:就是在事务中的一个方法(增删改查),调用另外一个方法(增删改查),此时一个方法中的事务和另外一个方法中的事务是否共享(是否sqlSesion共享)

propagation传播行为

当涉及到事务嵌套(Service调用Service)时,可以设置:

  • SUPPORTS = 不存在外部事务,则不开启新事务;存在外部事务,则合并到外部事务中。(适合查询)
  • REQUIRED = 不存在外部事务,则开启新事务;存在外部事务,则合并到外部事务中。 (默认值)(适合增删改)

SUPPORTS

 

java 主动事务 java事务机制_java_02

正在上传…重新上传取消

REQUIRED

java 主动事务 java事务机制_数据库_03

正在上传…重新上传取消

事务的第一个方面是传播行为。传播行为定义关于客户端和被调用方法的事务边界。Spring定义了7中传播行为。