事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元)。
简单理解的事务:
就是把一堆事情绑在一起做,都成功了才算完成,否则就恢复之前的样子
举例:银行ATM取钱,扣款成功后突然大停电,吐钱的操作还没做,这时候就要恢复没取钱时候的状态,否则钱扣了还没拿到手,多冤枉
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
A事务读取B事务尚未提交的更改数据,并在这个数据的基础上进行操作,这时候如果事务B回滚,那么A事务读到的数据是不被承认的。
例如常见的取款事务和转账事务:

不可重复读指在一个事务内读取表中的某一行数据,多次读取结果不同。
例如银行想查询A帐户余额,第一次查询A帐户为200元,此时A向帐户内存了100元并提交了,银行接着又进行了一次查询,此时A帐户为300元了。银行两次查询不一致,可能就会很困惑,不知道哪次查询是准的。
不可重复读和脏读的区别是,脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据。
例如:银行系统在同一个事务中两次统计存款账户的总金额,在两次统计中,刚好新增了一个存款账户,存入了100,这时候两次统计的总金额不一致。

A事务撤销时,把已经提交的B事务的更新数据覆盖了。例如:
这时候取款事务A撤销事务,余额恢复为1000,这就丢失了更新
A事务覆盖B事务已经提交的数据,造成B事务所做的操作丢失
MySQL数据库共定义了四种隔离级别:
@Transactional注解可以作用于接口、接口方法、类以及类方法上
|
属性 |
描述 |
|
Value |
可选的限定描述符,指定使用的事务管理器 |
|
Propagation |
可选的事务传播行为设置默认值为REQUIRED |
|
Isolation |
可选的事务隔离级别设置默认值采DEFAULT |
|
Read_Only |
该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。 |
|
Timeout |
事务超时时间设置 默认是30秒 默认值设置为-1表示永不超时 |
|
rollbackFor |
该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。 |
|
rollbackForClassName |
该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚 |
|
noRollbackFor |
该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚 |
|
noRollbackForClassName |
该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚 |
1.@Transactional(propagation=Propagation.REQUIRED) :
如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
2.@Transactional(propagation=Propagation.NOT_SUPPORTED) :
容器不为这个方法开启事务
3. @Transactional(propagation=Propagation.REQUIRES_NEW) :
不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
4. @Transactional(propagation=Propagation.MANDATORY) :
必须在一个已有的事务中执行,否则抛出异常
5.@Transactional(propagation=Propagation.NEVER) :
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
6.@Transactional(propagation=Propagation.SUPPORTS) :
如果其他bean调用这个方法,在其他bean中声明了事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
事务隔离级别介绍:
原文:https://www.cnblogs.com/yanzhong/p/13720360.html