事务
spring事务
是操作数据库的最小工作单元,为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行,或都不执行,事务是一组不可在分割的操作集合
一起成功(事务提交),一起失败(事务回滚)
spring事务的四大特性:(一原持久隔离)
一致性:事务执行后,数据库与其他业务保持一致,无论是成功还是失败。如转账业务,参与转账的两个账号余额之和应该是不变的
原子性:事务操作是不可再分割的原子单位,事务中所有的操作要么执行全部成功,要么全部执行失败。
持久性:一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。
隔离性:隔离性指在并发操作中,不同事物之间应该隔离开来,使每个并发中的事务不会相互干扰。
spring事务的隔离级别情况
脏读
小花读取了小明未提交的新事务,然后小明回滚了,小花就读取了错误的数据(小明的事务在中间回滚了,实际上小花,小明的钱款并未改变)
不可重复读
一个事务范围内多次查询却返回了不同的数据,这是由于查询间隔,被另一个事务修改并提交了。
幻读
也是不可重复读的特性导致
a事务中有查询和修改两个动作,查询只有一条数据和修改以为也只有一条,但是在同一时间b事务插入了一条数据并提交事务,a事务的修改就修改了两条然后才提交事务。所以再次查询就修改了两条数据产生了幻读
第一类事务丢失(回滚事务丢失)
小明这个事务取50,然后中途放弃把50又还回去(回滚),这时如花这个事务放了50进去,跟回滚重合如花这个事务就丢失了。
第二类事务丢失(提交覆盖丢失)
小花开个事务放50进去,这时小明也开了个事务放50进去,导致小明覆盖了小花,小花事务丢失,总金额只有150
spring事务的隔离级别5种
DEFAULT
默认隔离级别,每种数据库支持的事务隔离级别不一样,MySQL默认采用的REPEATABLE_READ隔离级别,Oracle默认采用的READ_COMMITTED隔离级别。
READ_UNCOMMITTED
读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用
READ_COMMITED
读已提交,允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
REPEATABLE_READ
重复读取,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
SERLALIZABLE
串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面