精华内容
下载资源
问答
  • 数据库事务解决

    千次阅读 2007-05-18 14:32:00
    在session bean中跨数据库事务处理的解决。 觉得在ejb中异常的处理还是有许多要注意的地方。 在ejb中通常分两类异常, 一类为系统异常, 一类为应用程序异常(这里暂不包含JVM的异常,对 JVM 异常我们一般也...

      session bean中跨数据库的事务处理的解决。

      觉得在ejb中异常的处理还是有许多要注意的地方。

      ejb中通常分两类异常,
      一类为系统异常,
      一类为应用程序异常(这里暂不包含JVM的异常,对 JVM 异常我们一般也无能为力),
         对于应用程序的异常,ejb容器不会去自动处理,当我们在进行跨数据库操作时抛出了SQLException异常,容器不会管,所以做不到事务的回滚,我们必须要手动的调用sessionContext的方法来让容器处理异常,达到事务的一致性;
         而对于系统异常,ejb容器是会自动去处理的,即使我们对它进行了catch,ejb容器仍然会知道,会去处理,所以这给了我们处理跨数据库操作维持事务的第二种方法,就是我们在ejb方法中捕获我们实际操作数据库的异常然后重新抛出一个系统异常。
    例如:EJBException,这样容器就会察觉接手处理,从而达到跨数据库事务的自动维护。在这里有个细节就是我要是在业务逻辑处理中抛出EJBException,而在ejb方法中手动进行了catch,则此时容器是不会觉察到系统异常的,但如果我仍在dao中抛出ejbexception,我在session bean中调用它,竟然不用手写catch,容器会自动捕获进行处理,并且能做到事务的维护,当然我在dao中抛出一个ejbexception会显的极不合适;所以最好还是在ejb方法中捕获dao抛出的应用程序异常,而在catch中抛出一个ejbexception,让容器去处理,事实上这时你是不能再在ejb方法中去catch这个ejbexception了,容器不让你这样写代码。
    继续学习中~
     
    展开全文
  • 数据库事务机制

    千次阅读 2017-10-01 13:45:42
    数据库事务机制 为什么需要事务,并发访问数据会造成什么问题 事务的ACID原则 事务的隔离级别 数据库的锁机制 为什么需要锁,存在哪些锁 悲观锁 数据库的悲观锁有两种实现方式:共享锁和排它锁,根据锁的...

    1. 数据库的事务机制

    1.1 为什么需要事务

    在实际中存在并发访问数据的问题,比如当A在查询数据库里的某条记录时,同一时刻B对这条记录进行了修改,那么A就有可能读取到有问题的脏数据。数据库的事务机制,就是为了解决并发访问所产生的问题。

    事务的基本操作:
    1. 开启一个事务
    2. 进行一系列的数据操作
    3. 提交或回滚事务,提交成功则将数据持久化到数据库,否则该事务中的所有数据操作全部无效

    1.2 事务的ACID原则

    事务具备四个特性:原子性、一致性、隔离性、持久性(ACID原则)

    原子性(Atomic)

    一个事务内的所有操作都是原子性的,要么全部成功,要么全部失败

    一致性(Consistency)

    在完成一个事务操作后应该使数据库从一个一致性状态达到另一个一致性状态,比如在转账功能中,A转账给B一百元,那么B的账号增加一百元,而A的账号也应该减少一百元。

    一致性可以说是ACID原则中最基础的特性,其他三个特性都是为了保证一致性而存在的。关于数据库的一致性更加具体的说明可以参考知乎的该问答

    隔离性(Isolation)

    不同事务之间的操作互不影响,数据库对于事务存在着不同的隔离级别,详情请见下文。

    持久性(Durability)

    事务的操作一旦完成,必须持久化到数据库中。

    1.3 并发访问数据会造成什么问题

    并发访问数据会出现三种情况:脏读、不可重复读、幻读。

    脏读(Dirty Read)

    当事务A在修改(insert、delete、update)记录但还未提交时,另一个事务B读取了该记录,此时事务B读到的数据就是脏数据,如果此时事务A回滚了事务,则事务B读到的数据无效。

    不可重复读(Non-repeatable Read)

    当事务A在读取记录时,另一个事务B修改(delete、update)了该记录并提交,此时事务A再一次读取该记录会读取到被事务B修改后的数据。在一个事务中前后两次读取的数据不一样,因此被称作不可重复读。

    幻读(Phantom Read)

    当事务A在读取记录时,另一个事务B插入(insert)了新记录并提交,导致事务A再次查询记录时多出了原本不存在的记录,就像看到了幻觉一样,所以被称作幻读。

    1.4 事务的隔离级别

    事务的隔离级别描述了事务被隔离的程度,其隔离级别有4个,由低到高依次为Read Uncommitted 、Read Committed 、Repeatable Read 、Serializable。通过设置不同的事务隔离级别可以解决脏读、不可重复读和幻读。

    读未提交(Read Uncommitted)

    在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。在实际中很少使用这种隔离级别,其性能并没有比其他隔离级别好多少,且会发生脏读、不可重复读和幻读。

    读提交(Read Committed)

    在该隔离级别,所有事务都只能看到其他已经提交的事务的执行结果。这是大多数数据库系统的默认隔离级别(MySQL默认的是可重复读),在该隔离级别会发生不可重复读和幻读。

    可重复读(Repeatable Read)

    这是MySQL默认的事务隔离级别,该隔离级别虽然解决了脏读和不可重复读,但还是无法避免幻读。

    可串行化(Serializable)

    最高级别的事务隔离级别,通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。但是系统开销花费最高,性能很低,一般很少使用。

    • √表示发生,×表示不会发生
    脏读 可重复读 幻读
    读未提交
    读提交 ×
    可重复读 × ×
    可串行化 × × ×

    1.5 如何查询并设置数据库中的事务隔离级别

    1.5.1 MySQL

    MySQL支持四种事务隔离级别,默认的事务隔离级别是Repeatable Read

    查询事务隔离级别

    //查询下一个(未开启)事务的隔离级别
    select @@tx_isolation;
    //查询当前会话事务的隔离级别
    select @@session.tx_isolation;
    //查询全局事务的隔离级别
    select @@global.tx_isolation;
    

    修改事务隔离级别

    set [SESSION | GLOBAL] transaction isolation level {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
    

    如果不添加session或者global,则是为下一个(未开启)事务设置隔离级别,比如

    //为下一个(未开启)事务设置read uncommitted隔离级别
    set transaction isolation level read uncommitted
    

    如果添加了session关键字则表示为当前连接上执行的事务设置默认的隔离级别;如果添加了global关键字则表示在全局为所有新创建的连接上执行的事务设置默认的隔离级别

    还可以使用另一种方式来设置隔离级别

    set @@tx_isolation = 'read-committed';
    set @@session.tx_isolation = 'repeatable-read';
    set @@global.tx_isolation = 'read-uncommitted';
    

    1.5.2 Oracle

    Oracle只支持两种事务隔离级别Read Committed和Serializable,所以Oracle不支持脏读。Read Only是Serializable的子集,两者都避免了不可重复读和幻读,区别是Read Only不允许在事务中进行DML操作,而Serializable可以。Oracle的默认事务隔离级别是Read Committed。

    设置事务隔离级别

    SET TRANSACTION ISOLATION LEVEL [READ COMMITED | SERIALIZABLE | READ ONLY];
    

    设置一个会话的隔离级别

    ALTER SESSION SET ISOLATION_LEVEL [READ COMMITTED| SERIALIZABLE];
    

    事务的隔离级别和锁机制的关系

    为了维护数据库事务的ACID四大特性,数据库一般使用加锁这种方式。事务隔离级别是为了有效保证并发读取数据的正确性,而数据库的锁机制,则是为了构建这些隔离级别而存在的。

    关于数据库的锁机制,可以参考这篇文章

    展开全文
  • 数据库事务

    千次阅读 2019-02-03 14:06:03
    数据库事务 ACID A : Atomic:原子性:指数据库事务要么完成,要么不做.是一个不可分割的原子操作; C:consistency: 一致性:指事务完成要保证业务逻辑数据一致;即业务是A账户向B账户转账,无论怎么转,事务完成后必须保证...

    面试准备,仅为一家之言,无法保证理解正确性,慎,欢迎纠正

    数据库事务

    ACID

    • A : Atomic:原子性:指数据库事务要么完成,要么不做.是一个不可分割的原子操作;
    • C:consistency: 一致性:指事务完成要保证业务逻辑数据一致;即业务是A账户向B账户转账,无论怎么转,事务完成后必须保证A账户和B账户的总额不变;
    • I:Isolation: 隔离性: 指不同事务有自己的执行空间,各自的操作不会影响到其他事务的执行;这里可以通过设置不同的隔离级别来控制事务的隔离强度,隔离级别越高,数据一致性越好,并发性能越低;
    • D: Durability:持久性: 一旦事务成功提交,对数据的操作必须写进数据库中,即使是事务刚提交,数据库就崩溃,也要保证下一次重启时,之前的数据操作可以写到数据库中;

    InnoDB对ACID的实现

    事务的ACID是通过InnoDB日志和锁来保证。事务的隔离性是通过数据库锁的机制实现的,持久性通过redo log(重做日志)来实现,原子性和一致性通过Undo log来实现。UndoLog的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到一个地方(这个存储数据备份的地方称为UndoLog)。然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。
    和Undo Log相反,RedoLog记录的是新数据的备份。在事务提交前,只要将RedoLog持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是RedoLog已经持久化。系统可以根据RedoLog的内容,将所有数据恢复到最新的状态。
    对具体实现过程有兴趣的同学可以去自行搜索扩展。

    链接:https://juejin.im/post/5b5a0bf9f265da0f6523913b

    数据库并发问题

    • 脏读: A事务读取了B事务尚未提交的更改数据,并使用这个数据进行后续操作,但是B事务回滚,撤销了事务,B事务更改的数据就会被恢复为原来的值,但是A事务使用了被修改的值后又进行了一系列的操作;
    • 不可重复读: 指A事务分别在B事务开始和结束后读取了被B修改的值,造成A事务的操作数据不一致;
    • 幻读: 类似不可重复读,指A事务是在B事务新增数据操作前后读取到了包括新增数据的总数据,而造成数据不一致的问题;主要是前一次读取时还满足要求,但在执行时又不满足了;
    • 不可重复读和幻读的区别有很多误解,一般的理解是不可重复读指两次读取读到修改数据,而幻读是读到新增和删除的数据,一开始我也是这样认为的,但是又有一篇博客,说到,幻读并不是这样的,而是读到的不一致影响了后续操作才叫幻读,总之,点进去看吧
    • 第一类丢失更新: 我觉得类似脏读,指A事务先读到一个值a,在后续操作前,B事务将该值修改为b,然后提交事务,然后A在原来读取到的值a的基础上继续执行,并做了修改为c,但是因为一些问题发生回滚,值被回滚到a,这时,B事务的操作就被丢失了,造成数据不一致;
    • 第二类丢失更新: 类似第一类丢失更新,指A事务先读到一个值a,然后B事务开始并将a修改为b,提交事务,但是A事务继续执行,经a修改为c,这时丢失了B事务的更新;

    事务隔离级别

    隔离级别 脏读 不可重复读 幻读 第一类丢失更新 第二类丢失更新
    READ UNCOMMITED 允许 允许 允许 不允许 允许
    READ COMMITED 不允许 允许 允许 不允许 允许
    REPEATABLE READ 不允许 不允许 允许 不允许 不允许
    SERIALIZABLE 不允许 不允许 不允许 不允许 不允许
    • 未提交读: 一个事务可以读到另一个未提交的事务修改的值;
    • 提交读: 本事务读到的数据是最新的,也就是说一个事务内相同的query操作可以得到不同的结果(中间有其他事务提交)
    • 可重复读: 本事务的相同的多次query操作得到的结果是一样的
    • 串行读: 事务间有类似读写锁的锁机制,并发读允许,并发写不允许
    • READ UNCOMMITED拥有最高的并发度和吞吐量,而SERIALIZABLE并发量最低;
    • Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别.

    数据库锁机制

    按所对象分可以分为表锁定和行锁定,前者对整张表锁定,后者对特定行锁定,从并发事务关系来看可以分为共享锁和独占锁;共享锁允许其他共享锁进入,排斥独占锁,而独占锁即防止共享锁也防止独占锁;

    • 行共享锁定:通过sql语句中select ... for update或者lock table in row share mode(oracle)获得共享锁定,

    • 行独占锁定:通过sql语句insert|update|delete 或者 lock table in row exclusive mode这些语句都是;

    • 表 共享锁定: 通过lock table in share mode,表共享可以防止行独占锁定和表独占锁定,允许表共享和行共享

    • 表共享行锁定 通过lock table in share row exclusive mode 显式获得,这种锁定可以防止其他回话获取一个表共享,行独占,或者表独占;只允许行共享

    • 表独占: 通过lock table in exclusive mode语句显示获得,什么都不允许

    • MyISAM使用的是表级锁, InnoDB使用的是行级锁

    InnoDB行级锁算法

    • Record Lock: 单行记录上的锁
    • Gap lock: 间隙锁,锁定一段距离,不包括记录本身
    • Next-key lock: record+gap,锁定一段距离,包括记录本身
    • 三种锁的具体讲解,可以看这篇博客:InnoDB锁机制
    • 使用next-key lock主要是为了解决幻读的问题,首先看上面对幻读的理解,事务1在执行期间,先获得信息是没有id=1的数据,正准备插入id=1的数据时,发现事务2已经插入了id=1的数据,导致之后的操作失败了,整个事务也就失败了
    • RR解决幻读的问题是这样的的,还是上面的例子,事务1在查到id=1没有时,就会加上next-key lock锁住一段间隙,这样事务2就无法插入数据了,而如果数据存在,比如事务1先查数据存在,正准备删除时,会为这条记录加上写锁,导致其他事务无法先删除
    展开全文
  • 数据库事务隔离级别总结

    万次阅读 多人点赞 2019-06-07 12:23:03
    学习数据库的时候常常会接触到事务, ACID等概念,那么到底什么是数据库的事务,数据库事务又具有哪些特点,和ACID有怎样的关系,事务的隔离级别又是做什么的呢?。 事务及其四大特性? 事务(Transaction):访问并...

    学习数据库的时候常常会接触到事务, ACID等概念,那么到底什么是数据库的事务,数据库事务又具有哪些特点,和ACID有怎样的关系,事务的隔离级别又是做什么的呢?。

    事务及其四大特性?

    事务(Transaction):访问并可能更新数据库中各种数据项的一个程序执行单元(unit),它通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起。当在数据库中更改数据成功时,在事务中更改的数据便会提交,不再改变。否则,事务就取消或者回滚,更改无效。

    举个例子来说,张三给李四转了1000元钱,那么在数据库操作时,就要先把张三的账户减去1000元,再把李四的账户加上1000元,两部分操作放在一起,才是一个完整的转账过程,也可称之为事务。

    (1)原子性(Atomicity)

    原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

    就像你买东西要么交钱收货一起都执行,要么要是发不出货,就退钱。

    (2) 一致性(Consistency)

    一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态

    拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

    打个比方,你买东西这个事情,是不影响其他人的。

    (3)隔离性(Isolation)

    隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离

    即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行

    关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

    (4)持久性(Durability)

    持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

    例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务已经正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

    打个比方,你买东西的时候需要记录在账本上,即使老板忘记了那也有据可查。

    InnoDB引擎的事务实现

    InnoDB是mysql的一个存储引擎,大部分人对mysql都比较熟悉,这里简单介绍一下数据库事务实现的一些基本原理,在本地事务中,服务和资源在事务的包裹下可以看做是一体的。
    在这里插入图片描述
    而事务的ACID是通过InnoDB日志和锁来保证。事务的隔离性是通过数据库锁的机制实现的,持久性通过redo log(重做日志)来实现,原子性和一致性通过Undo log(回撤日志)来实现。Undo Log的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到一个地方(这个存储数据备份的地方称为Undo Log)。然后进行数据的修改。如果出现了错误或者用户执行了roll back语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。 和Undo Log相反,Redo Log记录的是新数据的备份。在事务提交前,只要将RedoLog持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是RedoLog已经持久化。系统可以根据Redo Log的内容,将所有数据恢复到最新的状态

    事务的隔离性及隔离级别

    以上介绍完事务的四大特性(简称ACID),现在重点来说明下事务的隔离性,当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题:
    在这里插入图片描述
    在这里插入图片描述
    3、幻读:一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。如果事务中都使用快照读,那么就不会产生幻读现象,但是快照读和当前读混用就会产生幻读。关于快照读与当前读可参见《InnoDB对MVCC的实现》

    幻读和不可重复读都是读取了另一条已经提交的事务(这点就与脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

    “脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。数据库实现事务隔离的方式,基本上可分为以下两种:

    • 一种是在读取数据前,对其加锁,阻止其他事务对数据进行修改。
    • 另一种是不用加任何锁,通过一定机制生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取。从用户的角度来看,好像是数据库可以提供同一数据的多个版本,因此,这种技术叫做数据多版本并发控制(MultiVersion Concurrency Control,简称MVCC或MCC),也经常称为多版本数据库。

    数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上 “串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏感,可能更关心数据并发访问的能力。

    四种隔离级别

    为了解决“隔离”与“并发”的矛盾,ISO/ANSI SQL92定义了4个事务隔离级别,每个级别的隔离程度不同,允许出现的副作用也不同,应用可以根据自己的业务逻辑要求,通过选择不同的隔离级别来平衡 “隔离”与“并发”的矛盾。

    4个事务隔离级别:

    • Read uncommitted (读未提交):最低级别,以上问题均无法解决。
    • Read committed (读已提交):读已提交,可避免脏读情况发生。
    • Repeatable Read(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
    • Serializable (串行化):最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生。

    这四种隔离级别,分别有可能产生问题总结如下:
    在这里插入图片描述

    很多人容易搞混不可重复读和幻读,确实这两者有些相似。但不可重复读重点在于update和delete,而幻读的重点在于insert。避免不可重复读需要锁行(某一行在select操作时,不允许update与delete)就行,避免幻读则需要锁表。如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会发现莫名其妙多了一条之前没有的数据,幻读不能通过行锁来避免,需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。所以说不可重复读和幻读最大的区别,就在于如何通过锁机制来解决他们产生的问题

    以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然隔离级别越高,越能保证数据的完整性和统一性,但是执行效率就越低,对并发性能的影响也越大。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况

    各类流行的数据库都实现了一些SQL标准中的事务隔离级别,但是他们的实现也是极其不一样的。Oracle仅仅实现了RC 和 SERIALIZABLE隔离级别。默认采用RC隔离级别,解决了脏读。但是允许不可重复读和幻读。其SERIALIZABLE则解决了脏读、不可重复读、幻读。MySQL支持全部4个隔离级别,但在具体实现时,有一些特点,比如在一些隔离级别下是采用MVCC一致性读,但某些情况下又不是。MySQL默认采用RR隔离级别,SQL标准是要求RR解决不可重复读的问题,但是因为MySQL通过nex-key lock在RR隔离级别下解决了幻读的问题。那么MySQL的SERIALIZABLE是怎么回事呢?MySQL的SERIALIZABLE采用了经典的实现方式,对读和写都加锁。

    查看MySQL数据库当前事务的隔离级别:

    select @@tx_isolation;
    

    在这里插入图片描述
    在MySQL数据库中设置事务的隔离级别:

    set  [glogal | session]  transaction isolation level 隔离级别名称;
    set tx_isolation=’隔离级别名称;’
    

    在这里插入图片描述

    互联网项目中MySQL用什么事务隔离级别

    Mysql默认的事务隔离级别是可重复读(Repeatable Read),那互联网项目中Mysql也是用默认隔离级别,不做修改么? OK,不是的,我们在项目中一般用读已提交(Read Commited)这个隔离级别! 居然是读已提交。

    我们先来思考一个问题,在Oracle、SqlServer中都是选择读已提交(Read Commited)作为默认的隔离级别,为什么Mysql不选择读已提交(Read Commited)作为默认隔离级别,而选择可重复读(Repeatable Read)作为默认的隔离级别呢?

    我们先明白一点!项目中是不用读未提交(Read UnCommitted)和串行化(Serializable)两个隔离级别,原因有二: 采用读未提交(Read UnCommitted),一个事务读到另一个事务未提交读数据,这个不用多说吧,从逻辑上都说不过去!采用串行化(Serializable),每个次读操作都会加锁,快照读失效,一般是使用Mysql自带的分布式事务功能时才使用该隔离级别!也就是说,我们该纠结都只有一个问题,究竟隔离级别是用读已经提交呢还是可重复读? 接下来对这两种级别进行对比,讲讲我们为什么选读已提交(Read Commited)作为事务隔离级别!

    MySQL间隙锁

    当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(GAP LOCK)。举例来说,假如user表中只有101条记录,其empid的值分别是 1,2,…,100,101,下面的SQL:

    select * from  user where user_id > 100 for update;
    

    这是一个范围条件的检索且要求加上排他锁,InnoDB不仅会对符合条件的user_id值为101的记录加锁,也会对user_id大于101(这些记录并不存在)的“间隙”加锁。

    InnoDB使用间隙锁的目的,一方面是为了防止幻读(为了防止幻读去锁表则影响太大,会影响效率),以满足相关隔离级别的要求,对于上面的例子,要是不使用间隙锁,如果其他事务插入了user_id大于100的任何记录,那么本事务如果再次执行上述语句,就会发生幻读;另外一方面,是为了满足其恢复和复制的需要(发生幻读时的binlog,如果直接拿到备库去执行会发生了主备数据不一致的严重问题)

    很显然,在使用范围条件检索并锁定记录时,InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入,这往往会造成严重的锁等待。因此,在实际应用开发中,尤其是并发插入比较多的应用,我们要尽量优化业务逻辑,尽量使用相等条件来访问更新数据,避免使用范围条件;当然,对一条不存在的记录加锁,也会有间隙锁的问题。

    间隙锁在InnoDB的唯一作用就是防止其它事务的插入操作,以此来达到防止幻读的发生,所以间隙锁不分什么共享锁与排它锁。如果InnoDB扫描的是一个主键、或是一个唯一索引的话,那InnoDB只会采用行锁方式来加锁,而不会使用Next-Key Lock的方式,也就是说不会对索引之间的间隙加锁。

    要禁止间隙锁的话,可以把隔离级别降为读已提交,或者开启参数innodb_locks_unsafe_for_binlog。

    RC与RR在锁方面的区别

    1、RR要用到间隙锁,而RC则没有间隙锁。因为MySQL的RR需要间隙锁来解决幻读问题。而RC隔离级别则是允许存在不可重复读和幻读的。所以RC的并发一般要好于RR;在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多;
    2、 RC 隔离级别,通过 where 条件过滤之后,不符合条件的记录上的行锁,会被释放掉,但是RR隔离级别,即使不符合where条件的记录,也不会释放行锁和间隙锁,所以从锁方面来看,RC的并发应该要好于RR;
    3、RC隔离级别时,事务中的每一条select语句会读取到他自己执行时已经提交了的记录,也就是每一条select都有自己的一致性读ReadView; 而RR隔离级别时,事务中的一致性读的ReadView是以第一条select语句的运行时,作为本事务的一致性读snapshot的建立时间点的,只能读取该时间点之前已经提交的数据

    展开全文
  • 数据库事务

    千次阅读 2018-07-31 11:18:42
    在开始编写文章前,有几个问题需要思考一下: ...如果 SQL 语句中的任何一个失败,那么整个事务必须回滚到原始的数据库状态,这个状态也就是该事务开始之前的状态。一个成功事务是将数据库从一个...
  • 事务数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。 2. 一致性(Consistemcy): 事务前后,数据库的状态都满足所有的完整性约束。 3. 隔离性(Isolation): 并发执行的事务是隔离的,不会...
  • MySQL数据库事务及并发问题的解决

    千次阅读 2019-05-16 16:29:35
    常见的关系型数据库有MySQL、Oracle、SQLServer等,其中MySQL成为目前互联网企业应用...接下来小编对数据库事务以及并发问题的解决进行分析和总结: 预计阅读时间:5分钟 什么是事务 事务是一条或多条数据库操作语...
  • 直接在方法上加@Transactional注解 String str = reMap.get(...加了注解后删除和更新的事务会回滚 具体的注解参数请自行百度 @Transactional public Map test() { Map reMap =new HashMap(); //删除 testMap...
  • 事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作...事务数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。 针对上面的描述可以看出,事务的提出主要是为了解决并发情况下保
  • 数据库事务的管理

    千次阅读 热门讨论 2014-10-14 21:27:13
    如果把事务管理比喻成一块砖的话,那么数据库管理就是一座房子,可见,事务管理是数据管理的基础并且它们有着紧密的联系。下面我先从宏观上介绍一下事务管理与数据库的管理。  一、导图宏观把控  事务是构成单一...
  • 数据库事务详解

    千次阅读 2017-03-09 20:53:17
    什么是『事务』?事务就是一组具有原子性的操作,这一组操作要么...2. 一致性事务开始前和事务结束后,数据库的完整性约束没有被破坏。3. 隔离性事务的执行是相互独立的,它们不会相互干扰,一个事务不会看到另一个正在
  • 但所谓成也萧何,败也萧何,随着数据量的爆炸式增长,特别是近几年的大数据的蓬勃发展,关系型数据库的事务成为了互联网应用的性能瓶颈,NoSQL正是摒弃了关系型数据库事务的某些属性,使得对于某类特殊应用,其性能...
  • 例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。 。所以,应该把它们看成一个事
  • 分布式数据库事务

    千次阅读 2018-07-19 10:59:23
    这时候事务不能只依靠本地数据库事务支持来实现了。 二、集中实现方案 2.1 两阶段提交(2PC) 假设事务在a,b两个数据库上。 那现在要对这两个数据库实现事务支持, 就是分别操作a,b上的事务, 由一个中间件...
  • 数据库事务回滚

    万次阅读 2017-09-05 20:24:36
    spring 事务回滚 1、遇到的问题  当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下: ? 1 2 3 4 5 6 7 public ...
  • 数据库事务隔离级别

    万次阅读 多人点赞 2018-08-26 12:44:45
    mysql事务隔离级别 ...mysql中有四种隔离级别,分别是读未提交(Read uncommitted),读已提交(Read committed),可重复读(Repeatable read),可串行化(Serializable),用来解决数据库操作中产...
  • 数据库事务日志已满的解决办法

    万次阅读 2017-04-17 14:17:53
    数据库事务日志已满的解决办法,处理方法很简单: 1、使用命令: Backup log with truncate_only 2、在要减小日志的数据库上单击右键,  出现: 设置好点击“确定”就可以了。
  • 数据库事务的特性

    千次阅读 2019-05-12 23:00:37
    事务数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 2 .一致性 事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结...
  • 如何开启不同数据库事务

    千次阅读 2019-03-14 17:45:12
    这篇博客主要是为了解决:当项目中有多个数据库时,如何将多个数据库区分开来,开启一个数据库事务 在spring的配置文件applicationContext.xml中分别配置2个DataSource, 开启2个事务 <!-- 配置数据源1 -...
  • 在查询分析器中运行:backup log XXX with no_log 来截断事务日志。 ...执行DBCC SHRINKDATABASE(XXX)来收缩数据库。...一般在数据库中插入大量数据或者...请备份该数据库事务日志以释放一些日志空间。 一般考虑
  • 数据库事务的简单介绍

    千次阅读 2019-11-04 16:28:22
    数据库事务
  • 数据库事务管理

    千次阅读 2018-04-09 23:15:49
    事务的概念 事务是访问并可能更新各种数据项的一个程序执行单元。事务有四个基本性质: 1、原子性:事务中的全部操作要么全部做...3、一致性:在没有其他事务并发执行的情况下,保持数据库的一致性 4、持久性:一...
  • MySQL数据库事务基本操作

    千次阅读 2017-06-22 13:33:23
    这篇日志是自己学习了MySQL数据库事务之后,总结的一点心得体会。都是一些非常基础的知识点。如能帮助诸位初学者,那真是我的荣幸。 数据库事务,很多的博客也都有了详细的介绍。最基本的事务特性啊(ACID)这里...
  • MySQL数据库事务处理

    万次阅读 多人点赞 2017-03-16 15:43:33
    事务处理用于有效记录某机构感兴趣的业务活动(称为事务)的数据处理(例如销售、供货的定购或货币传输)。...本文对数据库事务处理相关的存储引擎、事务处理的概念、分离水平、以及死锁进行简单介绍。
  • (MySQL数据库默认的存储引擎类型是MyISAM,这种存储引擎类型不支持事务处理。) 导致在项目测试中发现异常后,事务无回滚动作。 解决办法: 1. 在Spring data jpa中的配置中添加database-platform: org....
  • 数据库事务,脏数据

    千次阅读 2014-06-26 16:38:10
    数据库事务,是指作为单个逻辑工作单元执行的一系列操作。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的...
  • Neo4j数据库事务

    千次阅读 2011-10-03 20:18:17
    1.事务管理 为了保持数据的完整性和保证良好的事务行为,Neo4j也支持ACID特性: (1).原子性:一整个事务中的所有操作...一致性:在事务开始之前和事务结束以后,数据库的完整性限制没有被破坏。  (3).隔离性:两个

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 366,088
精华内容 146,435
关键字:

数据库长事务解决