什么是事务?
事务是并发控制单元,使用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单元…
事务的四个特性
- 原子性
- 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚.
- 一致性
- 一致性是指事务执行之前和执行之后都处于一致性状态.
- 隔离性
- 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离.
- 持久性
- 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即使是在数据库系统遇到故障的情况下也不会丢失提交事务的操作.
Spring中的事务回滚
代码中事务控制的三种方式
- 编程式事务. 就是直接在代码里手动开启事务,手动提交,手动回滚.
- 声明式事务, 就是使用SpringAop配置事务.这里所说的声明,就是指在配置文件中声明。
- 注解事务, 直接在service层的方法上加@Transaction注解.
事务隔离级别出现的问题
- 脏读
- 脏读是指在一个事务处理过程里读取到了另一个未提交的事务中的数据.
- 不可重复读
- 不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了.
- 虚读(幻读)
- 幻读是事务非独立执行时发生的一种现象.
解决以上问题的方法
通过设置隔离级别解决上述问题.
- Serializable(串行化):可避免脏读,不可重复读,幻读的发生
- Repeatable read(可重复读):可避免脏读,不可重复读发生.
- Read committed(读已提交):可避免脏读的发生
- Read uncommitted(读未提交):最低级别,任何情况都无法保证.