事务的四大特征
最为基础的四大特征分别为
- 原子性:是不可分割的最小单位,要么同时成功,要么同时失败
- 一个原子事务要么完整执行,要么干脆不执行。这意味着,工作单元中的每项任务都必须正确执行。
- 如果有任一任务执行失败,则整个工作单元或事务就会被终止。即此前对数据所作的任何修改都将被撤销。
- 如果所有任务都被成功执行,事务就会被提交,即对数据所作的修改将会是永久性的。
- 持久性:当事务提前或回滚后,数据库持久化保存的数据
- 一致性代表了底层数据存储的完整性。它必须由事务系统和应用开发人员共同来保证。事务系统通过保证事务的原子性,隔离性和持久性来满足这一要求;
- 应用开发人员则需要保证数据库有适当的约束(主键,引用完整性等),并且工作单元中所实现的业务逻辑不会导致数据的不一致
- (即,数据预期所表达的现实业务情况不相一致)。例如,在一次转账过程中,从某一账户中扣除的金额必须与另一账户中存入的金额相等。
- 隔离性:多个事务之间,相互独立
- 隔离性意味着事务必须在不干扰其他进程或事务的前提下独立执行。换言之,在事务或工作单元执行完毕之前,其所访问的数据不能受系统其他部分的影响。
- 一致性:事务操作前后。数据不变
- 持久性表示在某个事务的执行过程中,对数据所作的所有改动都必须在事务成功结束前保存至某种物理存储设备。这样可以保证,所作的修改在任何系统瘫痪时不至于丢失。
事务的隔离级别(了解)
- 概述:多个事务之间隔离的,相互独立的。但是多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这血问题
-
事务隔离级别有4种,但是像Spring会提供给用户5种,来看一下:
- 1、DEFAULT
使用"select @@tx_isolation"来查看默认的事务隔离级别
默认隔离级别,每种数据库支持的事务隔离级别不一样,如果Spring配置事务时将isolation设置为这个值的话,那么将使用底层数据库的默认事务隔离级别。顺便说一句,如果使用的MySQL,可以使用"select @@tx_isolation"来查看默认的事务隔离级别
SET GLOBAL TRANSACTION INSLATION LEVEL 级别字符串;
SET GLOBAL TRANSACTION INSLATION LEVEL REPEATABLE_READ;
- 2、READ_UNCOMMITTED
读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用
会产生的问题:脏读,不可重复读,幻读。
-
3、READ_COMMITED(Orcale)
读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读
会产生的问题:不可重复读,幻读
- 4、REPEATABLE_READ(mysql默认)
重复读取,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、 不可重复读的问题,但是幻读的问题还是无法解决
会产生的问题:幻读
5、SERLALIZABLE
串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了
网上专门有图用表格的形式列出了事务隔离级别解决的并发问题:
可与解决所有的问题
注:隔离级别从小到大安全性越来越高,但是效率越来越差
标签:事务,隔离,幻读,数据,READ,533,532,级别 From: https://www.cnblogs.com/agzq/p/16788125.html