Spring数据库事务管理

1.为什么需要事务

事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。 。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性 

 

2. 数据库的ACID特性

  1. 原子性(Atomicity)  一个事务必须被视为一个不可分割的最小工作单元,​​​​整个事务中的所有操作,要么全部成功,要么全部失败
  2. 一致性(Consistency) 事务必须保持系统从始至终都处于一致的状态
  3. 隔离性(Isolation) 指的是两个事务之间的隔离程度
  4. 持久性(Durability) 一个成功的事务将永久性地改变数据库的状态

 

3. 隔离级别

  1. 脏读(dirty-read)允许一个事务读取另一个未提交的数据
  2. 读写提交(read-commit)一个事务只能读取另一个事务已提交的数据
  3. 可重复读(repeatable-read)针对"不可重复读" 的隔离级别,MySQL的默认隔离解蔽额
  4. 串行化(Serialization)  事务“串行化顺序执行”,也就是一个一个排队执行。

 

4.错误

  1. 不可重复读  对于一个表是不能重复读取的,因为他是一个变换的值,就是每次读取的结果都不一致 
  2. 脏读  读取了已经无效的数据
  3. 幻读  当A事务执行delete/insert 后,B事务在读取的两次结果不一样

 

5.传播行为

  1. required(Spring默认) 当方法调用时,如果不存在当前事务,就创建事务;如果之前的方法有事务,就沿用之前方法的事物
  2. supports         当方法调用时,如果有事务就用,没事务就不用事务
  3. mandatory  方法必须在事务内运行否在抛异常
  4. requires_new  无论是否在当前事务,方法都会在新的事务中运行
  5. not_supported 不支持事务,如果不存在当前事务也不会创建事务,如果存在就挂起事务,方法结束恢复事务
  6. never 不支持事务,如果存在事务就跑异常
  7. nested 嵌套事务 调用方法如果出现异常则只回滚自己内部执行的sql,不回滚主方法的sql

 

 

6.在Spring中使用事务

配置文件版

        
		
		
	
	
	
	 
		
	
	
	
	
		
			
			
			
		
	

注解版  

        
	 
		
	
	
	
    @Transactional
    @Service
    public class UserServiceImpl implements UserService{ ... }

 

你可能感兴趣的:(Java)