精华内容
下载资源
问答
  • 并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。 原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行。 可见性:当多...

    并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。

    原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行。

    可见性:当多个线程同时访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

    有序性:程序执行的顺序按照代码的先后顺序执行。

    对于单线程,在执行代码时jvm会进行指令重排序,处理器为了提高效率,可以对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证保存最终执行结果和代码顺序执行的结果是一致的。

    Java语言对原子性、可见性、有序性的保证

    1、原子性

    Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断,要么执行,要么不执行。

    X=10;  //原子性(简单的读取、将数字赋值给变量)

    Y = x;  //变量之间的相互赋值,不是原子操作

    X++;  //对变量进行计算操作

    X = x+1;

    语句2实际包括两个操作,它先要去读取x的值,再将y值写入,两个操作分开是原子性的。合在一起就不是原子性的。

    语句3、4:x++  x=x+1包括3个操作:读取x的值,x+1,将x写入

    注:可以通过 synchronized和Lock实现原子性。因为synchronized和Lock能够保证任一时刻只有一个线程访问该代码块。

     

    2、可见性

    Java提供了volatile关键字保证可见性。

    当一个共享变量被volatile修饰时,它会保证修改的值立即被其他的线程看到,即修改的值立即更新到主存中,当其他线程需要读取时,它会去内存中读取新值。

    Synchronized和Lock也可以保证可见性,因为它们可以保证任一时刻只有一个线程能访问共享资源,并在其释放锁之前将修改的变量刷新到内存中,

    3、有序性

    在Java里面,可以通过volatile关键字来保证一定的“有序性”(具体原理在下一节讲述volatile关键字)。另外可以通过synchronized和Lock来保证有序性,很显然,synchronized和Lock保证每个时刻是有一个线程执行同步代码,相当于是让线程顺序执行同步代码,自然就保证了有序性。

     Java内存模型:每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。

    Java内存模型具备一些先天的“有序性”,即不需要通过任何手段就能够得到保证的有序性,这个通常也称为happens-before 原则。如果两个操作的执行次序无法从happens-before原则推导出来,那么它们就不能保证它们的有序性,虚拟机可以随意地对它们进行重排序。

    指令重排序:java语言规范规定JVM线程内部维持顺序化语义。即只要程序的最终结果与它顺序化情况的结果相等,那么指令的执行顺序可以与代码顺序不一致,此过程叫指令的重排序。

    指令重排序的意义:JVM能根据处理器特性(CPU多级缓存系统、多核处理器等)适当的对机器指令进行重排序,使机器指令能更符合CPU的执行特性,最大限度的发挥机器性能。

    下面就来具体介绍下happens-before原则(先行发生原则):

    程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作

    锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作

    volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作。如果一个线程先去写一个变量,然后一个线程去进行读取,那么写入操作肯定会先行发生于读操作。

    传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C。

    线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作

    线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生

    线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行

    对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始

    展开全文
  • 数据库的事务必须满足4个特性:原子性一致性, 隔离性, 持久性,它们英文单词首字母合起来就是:ACID 在这些事务特性中,数据“一致性”为最终目标,其他特性都是为达到这个目标而采取的措施和手段。数据库...

    数据库的事务必须满足4个特性: 原子性, 一致性, 隔离性, 持久性,它们英文单词首字母合起来就是:ACID

          在这些事务特性中,数据“一致性”为最终目标,其他特性都是为达到这个目标而采取的措施和手段。 数据库管理系统一般采用重执行日志来保证原子性、一致性和持久性。重执行日志记录了数据库变化的每一个动作,数据库在一个事务中执行一部分操作后发生错误退出,数据库即可根据重执行日志撤销已经执行的操作。对于已经提交的事务即使数据库崩溃,在重启数据库时也能后根据日志对尚未持久化的数据进行相应的重执行操作。

    1、事务原子性

    定义:事务中的多个数据库操作是一个不可分割的原子单元整体,只有所有的操作执行成功,整个事务才提交。事务中的任何一个数据库操作失败,已经执行的任何操作都必须被撤销,让数据库返回初始状态。

    实现:事务内的一组操作全部成功(或者全部失败),为了实现原子性,就需要通过日志:将所有对数据的操作都写入日志,如果事务中的一部分操作已经成功,但后面部分操作,因为系统断电,操作系统崩溃等问题而没有成功执行,那么就要通过回溯日志,将前面已经成功执行的操作撤销,从而达到"全部执行失败"的效果。

     

    2、事务一致性

    事务操作成功后,保证数据不会被破坏。如A账户转账100元到B账户,不管操作成功与否,A和B账户的存款总额是不变的。

    一致性分为数据库外部一致性和内部一致性:

    i、数据库外部一致性:由外部的应用编码来实现,即银行的应用在进行转账的操作时,必须在同一事务内部调用对账户A和账户B的操作。如果在这个阶段出现错误,这不是数据库本身能解决的,也不属于我们要讨论的范围。

    ii、数据库内部的一致性:在同一个事务内部的一组操作必须全部成功(或者全部失败) 这就是事务原子性

     

    3、持久性

         一旦事务提交成功后,事务中所有的数据操作都必须被持久化到数据库中。即使在事务提交后,数据库马上崩溃,在数据库重启时,也必须保证能够通过某种机制恢复数据。

     

    4、事务隔离性

    详细转载此篇博客:

    引用:https://blog.csdn.net/u014079773/article/details/52808193

    1)事务并发所引起的问题:

    脏读:一个事务读到另外一个事务还没有提交的数据,我们称之为脏读。(进行存款事务时候,还没有存完,允许查询事务)

    不可重复读(Unrepeatable Read)

    在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。

    例如:事务B中对某个查询执行两次,当第一次执行完时,事务A对其数据进行了修改。事务B中再次查询时,数据发生了改变

    幻读(phantom read)

    幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.

     

    2)JDBC(隔离方案)事务隔离的四个级别:

      1.READ_UNCOMMITTED

      2.READ_COMMITTED

      3.REPEATABLE_READ

      4.SERIALIZABLE

    从上往下,级别越来越高,并发性越来越差,安全性越来越高

     脏读 不可重复读  幻读  
    Serializable 不会 不会        不会  
    REPEATABLE READ 不会 不会        会    
    READ COMMITTED  不会 会          会    
    Read Uncommitted会   会          会  

     

    3)Spring(隔离方案)事务传播行为

      1.PROPAGATION_REQUIRED

      2.RROPAGATION_REQUIRES_NEW

      3.PROPAGATION_NESTED

      4.PROPAGATION_SUPPORTS

      5.PROPAGATION_NOT_SUPPORTED

      6.PROPAGATION_NEVER

      7.PROPAGATION_MANDATORY

    Spring还有事务隔离级别、事务传播行为、事务超时时间、是否只读事务

    1.事务超时(Transaction Timeout):为了解决事务时间太长,消耗太多的资源,所以故意给事务设置一个最大时常,如果超过了,就回滚事务。

    2.只读事务(Readonly Transaction):为了忽略那些不需要事务的方法,比如读取数据,这样可以有效地提高一些性能。

     

    展开全文
  • 文章目录ACID特性#1 原子性#2 一致性#3 隔离性#4 持久性 ACID特性 数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity)、一致性(Consistency)、隔离性...

    ACID特性

    数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。(执行单个逻辑功能的一组指令或操作称为事务)

    #1 原子性

    原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。可采用“A向B转账”这个例子来说明解释在DBMS中,默认情况下一条SQL就是一个单独事务,事务是自动提交的。只有显式的使用start transaction开启一个事务,才能将一个代码块放在事务中执行。

    #2 一致性

    一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
    如A给B转账,不论转账的事务操作是否成功,其两者的存款总额不变(这是业务逻辑的一致性,至于数据库关系约束的完整性就更好理解了)。保障机制(也从两方面着手):数据库层面会在一个事务执行之前和之后,数据会符合你设置的约束(唯一约束,外键约束,check约束等)和触发器设置;此外,数据库的内部数据结构(如 B 树索引或双向链表)都必须是正确的。业务的一致性一般由开发人员进行保证,亦可转移至数据库层面。

    #3 隔离性

    多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
    在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。事务最复杂问题都是由事务隔离性引起的。完全的隔离性是不现实的,完全的隔离性要求数据库同一时间只执行一条事务,这样会严重影响性能。关于隔离性中的事务隔离等级

    #4 持久性

    这是最好理解的一个特性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)write ahead logging:SQL Server中使用了WAL(Write-Ahead Logging)技术来保证事务日志的ACID特性,在数据写入到数据库之前,先写入到日志,再将日志记录变更到存储器中。

    展开全文
  • 原子性 一致性 隔离性 持久性 事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。 事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务中的操作,要么都做修改,要么都不做,这...

    目录

    原子性

    一致性

    隔离性

    持久性 


    事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。 事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务中的操作,要么都做修改,要么都不做,这就是事务的目的

    原子性

    A (Atomicity) 原子性

    要么都做,要么都不做。

    只有使事务中所有的数据库操作 都执行成功,才算整个事务成功。事务中任何一个SQL语句执行失败,已经执行成功的 SQL语

    展开全文
  • 为什么会出现事务 [1]Transactions are not a law of nature; they were created with a purpose, namely to simplify the programming model for applications accessing a database....to ignore certain potential ...
  • Transaction 也就是所谓的事务了,通俗理解就是一件事情。从小,父母就教育我们,做事情...于是,人们就归纳出事务的第一个特性:原子性(Atomicity)。我靠,一点都不神秘嘛。 特别是在数据库领域,事务是一个非常...
  • 注: 重度参考了:https://www.zhihu.com/question/30272728/answer/72476703(讲的非常好,逻辑清晰) 轻度参考了:... 概念 原子性:一个事务内的操作,要么同时成功,要么同时...
  • 并发编程(原子性、可见性、一致性

    万次阅读 多人点赞 2017-12-18 16:47:09
    1、原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行。如果一个操作时原子性的,那么多线程并发的情况下,就不会出现变量被修改的情况...
  • 数据库的ACID(原子性一致性、隔离性与持久性)

    万次阅读 多人点赞 2018-05-08 15:45:37
    其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~ ACID特性 数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity)、一致性(Consistency)、隔离性...
  • MySQL 是如何保证一致性原子性和持久性的!

    千次阅读 多人点赞 2020-03-16 09:32:02
    编辑:业余草来源:https://www.xttblog.com/?p=4891今天,我们来简单的看一下 MySQL 的一致性原子性和持久性问题。后面...
  • 这个问题的有趣之处,不在于问题本身(“原子性一致性的实现机制是什么”),而在于回答者的分歧反映出来的另外一个问题:原子性一致性之间的关系是什么? 我特别关注了@我练功发自真心 的答案,他正确地指出...
  • 原子性: 就是一组操作要么同时发生, 要么一个都不发生 一致性(CONSISTENCY): 就是说, 执行完数据库操作后, 数据不会被破坏. 打个比方, 如果a账户转账到b账户, 不可能因为a账户扣了钱, 而b账户没有加钱 隔离性...
  • 在事务的四种特性中,原子性一致性、持久性通过数据库的redo log和undo log来完成,redo log称为重做日志,用来保证事务的原子性和持久性,undo log称为回滚日志,用来保证事务的一致性。事务的隔离性通过锁机制来...
  • 在数据库中,所谓事务是指一组逻辑操作单元即一组sql语句。当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交。...事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
  • Oracle 事务ACID基本概念(原子性一致性、隔离性、持久性)
  • 理解事务——原子性一致性、隔离性和持久性

    万次阅读 多人点赞 2013-08-17 23:50:37
    1. 原子性(Atomic)  一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。实现事务的原子性,要支持回滚操作,在某个操作失败后,回滚到事务执行之前的状态。  回滚实际上是一个比较高层抽象的概念,...
  • 看到别的博客说,一致性是事务的最终目的,原子性、隔离性、持久性都是为了实现一致性。 在这里,我打算验证一番。 怎么验证呢? 假设,这个事务系统如果是由我们来设计的话。 首先,场景是这样的,小范转100块...
  • 1. 原子性(Atomic)  一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。实现事务的原子性,要支持回滚操作,在某个操作失败后,回滚到事务执行之前的状态。  回滚实际上是一个比较高层抽象的概念...
  • 数据库特性之原子性一致性

    千次阅读 2017-07-16 11:27:05
    数据库的四大特性:原子性一致性,隔离性和持久性。其中: 原子性:指事务包含的所有操作要么全部成功,要么全部失败回滚; 一致性:指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个...
  •    &...很多复杂的事务要分布进行,但它们组成了一个整体,要么整体生效,要么整体...原子性(Atomicity),一致性(consistency),隔离性(Isolation),持久性(Durability)。 ...
  • Java的原子性&&可见性&&有序性

    万次阅读 2017-06-21 10:16:53
    Java的原子性&&可见性&&有序性原子性定义:原子性:是指一个操作或多个操作要么全部执行,且执行的过程不会被任何因素打断,要么就都不执行。原子操作原理(处理器是如何实现原子操作的)处理器实现原子操作有3种...
  • 也就是说ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。数据库必须要实现AID三大特性,才有可能实现一致性。例如,原子性无法保证,显然一致性...
  • 一、原子性原子性操作指相应的操作是单一不可分割的操作。例如,对int变量count执行count++d操作就不是原子性操作。因为count++实际上可以分解为3个操作:(1)读取变量count的当前值;(2)拿count的当前值和1做...
  • 其实一致性原子性在事务里是两个不太相关,但又很相关的逻辑来的 原子性:这个侧重点是事务执行的完整,一套事务下来,如果有一个失败,那整体失败。也就是要么大家一起成功,要么全都回滚。 一致性:这个侧重点是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 196,640
精华内容 78,656
关键字:

原子性一致性