文章目录
1.什么是事务?
事务是逻辑上的一组操作,要么都执行,要么都不执行.
2.事务的特性(ACID)
原子性:原子最小单位,不能分割,不能单独运行,要么成功要么失败。
一致性:例如能量守恒。
隔离性:多个并发访问时,一个事物的执行不能受其他事务的干扰。隔离级别解决问题。
持久性:事务一旦提交,它对数据库的修改是永久的。
3.事务没有隔离级别的问题
脏读:事务a读取了事务b未提交(commit)的数据,然后把他进行修改的操作,如果这时候事务b恰巧进行了回滚的操作,那么事务a读取到的就是脏数据,也就是所谓脏读。
不可重复读:是指事务a读取到了事务b已提交的数据,两次查询的结果不一致。
幻读:事务a读取到事务b提交的新增数据,幻读一般发生在统计数据中。
4.数据库事务隔离级别
常见的事务隔离级别有四种,从低到高依次是:
读未提交(Read uncommitted)
读已提交(Read committed)
可重复读(Repeatable read)
串行化(Serializable)
事务的隔离级别越低,可能出现的并发异常越多,但通常而言系统能提供的并发能力就越强。
读未提交(Read uncommitted),B事务可以读取到未提交的A事务中操作的数据,会导致脏读,为解决脏读,引入读已提交。
读已提交(Read committed),B事务要等A事务提交后才能读取到A事务中操作的数据,但是依然会导致不可重复读的问题(即B事务在A事务提交前后读取的数据不一致)。
可重复读(Repeatable read),一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的,Mysql是通过快照版本来实现可重复读的,即事务开始时就拿到了一个版本号,别的事务操作的数据版本号不一样,就不会影响当前事务重复读取的数据,但是会看不到别的事务提交的数据。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。
序列化(Serializable),最高的事务隔离级别,事务串行化顺序执行,但是效率低下,比较耗数据库性能,一般不使用。
5.Spring事务两种实现方式
6.那么什么是事务属性呢?
spring事务领头人叫Juergen Hoeller,于尔根·糊了…先混个脸熟哈,他写了几乎全部的spring事务代码。读源码先拜神,掌握他的源码的风格,读起来会通畅很多。
6.1.事务的定义
事务(Transaction)是数据库区别于文件系统的重要特性之一。目前国际认可的数据库设计原则是ACID特性,用以保证数据库事务的正确执行。Mysql的innodb引擎中的事务就完全符合ACID特性。
spring对于事务的支持,分层概览图如下:
6.2.事务的特性
要保证事务的ACID特性,spring给事务定义了6个属性,对应于声明式事务注解(org.springframework.transaction.annotation.Transactional)@Transactional(key1=,key2=…)
隔离级别: 为了解决数据库容易出现的问题,分级加锁处理策略。 对应注解中的属性isolation
超时时间: 定义一个事务执行过程多久算超时,以便超时后回滚。可以防止长期运行的事务占用资源.对应注解中的属性timeout
是否只读:表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务.对应注解中的属性readOnly
传播机制: 对事务的传播特性进行定义,共有7种类型。对应注解中的属性propagation
回滚机制:定义遇到异常时回滚策略。对应注解中的属性rollbackFor、noRollbackFor、rollbackForClassName、noRollbackForClassName
6.3.七个传播特性