什么是事物?
事物就是一系列操作的集合,一个逻辑工作单元。
事物有什么特性?
事物的特性总结起来就是ACID
- A(Atomicity)原子性:一个事物中的所有操作要么都成功,要么都失败。
- C(Consistency)一致性:事物操作前后,数据/资源都要保持一致性状态。
- I(Isolation)隔离性:事物中的操作不受其他事物的干扰。
- D(Durability)持久性:事物的更改一旦提交就保证不会丢失。
spring中的事物
传播(propagation)特性:
- required:当前有事物则加入,否则创建新的事物。
- requires_new:创建新的事物,如果当前有事物,则挂起当前事物。
- supports:当前有事物则加入,否则以非事物运行。
- not_supports:以非事物运行,当前有事物则挂起。
- never:以非事物运行,当前有事物则跑出异常。
- mandatory:如果但前有事物则加入,没有则抛出异常。
- nested:如果当前存在事物,则创建一个事物作为当前事物的嵌套事物来运行,如果没有当前没有事物,则相当于required,创建新的事物。
隔离(isolation)级别
- read_uncommitted:一个事物可以读取另一个事物中修改但未提交的数据。
- read_committed:一个事物只能读取另一个事物中已经提交的数据。
- repeatable_read:一个事物中,发生2次或者2次以上的查询,查询的结果都是一样的。即使是第一次查询之后有已经修改的满足结果的数据也不会被包含到查询结果当中。
- serializable:事物会串行之行,事物之间不会有影响。
脏读、不可重复读、幻读:
- 脏读:一个事物读取另一个事物未提交的数据。
例如:
张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。
与此同时,
事务B正在读取张三的工资,读取到张三的工资为8000。
随后,
事务A发生异常,而回滚了事务。张三的工资又回滚为5000。
最后,
事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。
- 不可重复读:同一个事物中,后一次查询一条记录与前一次查询这条记录之间,另一个事物修改了同一条记录并提交,这时候后一次查询得到的结果与前一次查询结果不一致称之为不可重复读。
例如:
在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。
与此同时,
事务B把张三的工资改为8000,并提交了事务。
随后,
在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读 。
- 幻读:针对一张表中的记录来说,一个事物在前一次查询记录数之后,另一个事物插入/删除了其中一条记录,后一次再查询,发现记录数与前一次查询不一致。
例如:
目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。
此时,
事务B插入一条工资也为5000的记录。
这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。
这里会发现不可重复度针对的是同一行记录来说,而幻读是指某一些记录来说,是一个统计的概念。