Spring事务和MySQL事务详解面试_第1页
Spring事务和MySQL事务详解面试_第2页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 Spring事务和MySQL事务详解试章录数据库事务事务是什么是数据库操作的最作单元,是作为单个逻辑作单元执的系列操作;这些操作作为个整体起向系统提交,要么都执、要么都不执;事务是组不可再分割的操作集合。事务的四特性1. 原性事务是数据库的逻辑作单位,事务中包含的各操作要么都做,要么都不做2. 致性事务执的结果必须是使数据库从个致性状态变到另个致性状态。3. 隔离性个事务的执不能被其它事务扰。即个事务内部的操作及使的数据对其它并发事务是隔离的,并发执的各个事务之间不能互相扰。4. 持续性也称永久性,指个事务旦提交,它对数据库中的数据的改变就是永久性的。接下来的其它操作或故障不应该对其执结果有

2、任何影响。MySQL 事务隔离级别隔离级别隔离级别的值导致的问题导致脏读Read-UncommittedRead-CommittedRepeatable-ReadSerializable0123避免脏读,允许不可重复读和幻读MySQL默认的隔离级别。避免脏读,不可重复读,允许幻读串化读,事务只能个个执,避免了 脏读、不可重复读、幻读。执效率慢,使时慎重1. 脏读个事务对数据进了增删改查,但是未提交事务。另个事物可以读取到未提交的数据,如果第个事务进了回滚,那么第个事务就读到了脏数据。例:领导给张三发资,10000元已打到张三账户,但该事务还未提交,正好这时候张三去查询资,发现10000元已到账

3、。这时领导发现张三资算多了5000元,于是回滚了事务,修改了额后将事务提交。最后张三实际到账的只有5000元。2. 不可重复度次事务发了两次读操作,两个读操作之间发了另个事务对数据修改操作,这时候第次和第次读到的数据不致。不可重复度关注点在数据更新和删除,通过级锁可以实现可重复读的隔离级别。例: 张三需要转正1000元,系统读到卡余额有2000元,此时张三婆正好需要转正2000元,并且在张三提交事务前把2000元转了,当张三提交转账是系统提余额不。3. 幻读幻读,指的是当某个事务在读取某个范围内的记录时,另外个事务在该范围内插了新的记录,当之前的事务再次读取该范围的记录时,会产幻。相对于不可重

4、复读,幻读更关注其它事务的新增数据。通过级锁可以避免不可重复读,但法解决幻读的问题,想要解决幻读,只能通过Serializable隔离级别来实现。例:张三婆准备打印张三这个的信卡消费记录,经查询发现消费了两次共1000元,这时张三刚按摩完准备结账,消费了1000元,这时银记录新增了条1000元的消费记录。当张三婆将消费记录打印出来时,发现总额变为了2000元,这让张三婆很诧异。4. 串化读Serializable是最的隔离级别,性能很低,般很少。在这级别下,事务是串顺序执的,不仅避免了脏读、不可重复读,还避免了幻读。查看MySQL当前事务隔离级别MySQL InnoDB默认的事务隔离级别为RE

5、PEATABLE-READ| REPEATABLE-READ |+-+MySQL默认操作模式为动提交模式除显的开启个事务,否则每个查询都被当成个单独的事务动执。可以通脱设置autocommit的值改变默认的提交模式。1. 查看当前提交模式mysql show variables like autocommit;+-+-+| autocommit | ON |+-+-+2. 关闭动提交。0代表关闭,1代表开启。mysql set autocommit = 0;Query OK, 0 rows affected (0.00 sec)mysql show variables like autocom

6、mit;+-+-+| autocommit | OFF |+-+-+JDBC处理事务 try connection = DriverManager .getConnection(jdbc:mysql:/localhost:3306/dbname?characterEncoding=utf-8 ,username, password);connection.setAutoCommit(true);/ close connectionSpring事务Spring事务本质是对数据库事务的持,如果数据库不持事务(例如MySQL的MyISAM引擎不持事务),则Spring事务也不会效。Spring的事务

7、传播事务传播为是指个事务法A被另个事务法B调时,这个事务A应该如何处理。事务A应该在事务B中运还是另起个事务,这个有事务A的传播为决定。事务传播属性定义TransactionDefinitionint PROPAGATION_NESTED = 6;常量名称常量解释新建事务,如果当前存在事务,把当前事务挂起。新建的事务将和被挂起的事务没有任何关系,是两个独的事务,外层事务失败回滚之后, 不能回滚内层事务执的结果,内层事务失败抛出异常,外层事务捕获, 也可以不处理回滚操作。 使JtaTransactionManager作为事务管理器PROPAGATION_REQUIRES_NEWPROPAGATI

8、ON_NOT_SUPPORTED 以事务式执操作,如果当前存在事务,就把当前事务挂起。使JtaTransactionManager作为事务管理器以事务式执,如果当前存在事务,则抛出异常。如果个活动的事务存在,则运在个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执。它使了个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。PROPAGATION_REQUIRED 如果存在个事务,则持当前事务,如果没有事务则开启事务。如下例,单独调methodB时,当前上下没有事务,所以会开

9、启个新的事务。调methodA法时,因为当前上下不存在事务,所以会开启个新的事务。当执到methodB时,methodB发现当前上下有事务,因此就加到当前事务A中来。Transactional(propagation = Propagation.REQUIRED)Transactional(propagation = Propagation.REQUIRED)public void methodB() / do something 如果存在个事务,持当前事务。如果没有事务,则事务的执.单独的调methodB时,methodB法是事务的执的。当调methdA时,methodB则加了methodA

10、的事务中,事务地执。Transactional(propagation = Propagation.REQUIRED)/SUPPORTSTransactional(propagation = Propagation.SUPPORTS)public void methodB() / do something 如果已经存在个事务,持当前事务。如果没有个活动的事务,则抛出异常。当单独调methodB时,因为当前没有个活动的事务,则会抛出异常throw new IllegalTransactionStateException(“Transaction propagationmandatory but

11、no existing transaction found”)当调methodA时,methodB则加到methodA的事务中,以事务式执。Transactional(propagation = Propagation.REQUIRED)Transactional(propagation = Propagation.MANDATORY)public void methodB() / do something 使PROPAGATION_REQUIRES_NEW,需要使 JtaTransactionManager作为事务管理器。它会开启个新的事务。如果个事务已经存在,则先将这个存在的事务挂起。从下

12、代码可以看出,事务B与事务A是两个独的事务,互不相。事务B是否成功并不依赖于 事务A。如果methodA法在调methodB法后的doSomeThingB法失败了,methodB法所做的结果依然被提交。除了 methodB之外的其它代码导致的结果却被回滚了Transactional(propagation = Propagation.REQUIRED)Transactional(propagation = Propagation.REQUIRES_NEW)public void methodB() / do something当调methodA(),相当于 /获得个JTA事务管理器tm = g

13、etTransactionManager ();tm.begin();/开启个新的事务Transaction ts1 = tm.getTransaction ();doSomeThing();tm.suspend();/挂起当前事务trytm.begin();/重新开启第个事务Transaction ts2 = tm.getTransaction ();methodB();/methodB执完后,恢复第个事务tm.resume(ts1);mit();/提交第个事务 catch(RunTimeException ex) ts1.rollback();/回滚第个事务 finally /释放资源PR

14、OPAGATION_NOT_SUPPORTED总是事务地执,并挂起任何存在的事务。使PROPAGATION_NOT_SUPPORTED,也需要使JtaTransactionManager作为事务管理器。PROPAGATION_NEVER 总是事务地执,如果存在个活动事务,则抛出异常。如果个活动的事务存在,则运在个嵌套的事务中。如果没有活动事务,则按TransactionDefinition.PROPAGATION_REQUIRED 属性执。这是个嵌套事务,使JDBC3.0驱动时,仅仅持DataSourceTransactionManager作为事务管理器。 需要JDBC 驱动的java.sql

15、.Savepoint类。使PROPAGATION_NESTED,还需要把PlatformTransactionManager的nestedTransactionAllowed属性设为true(属性值默认为false)。Transactional(propagation = Propagation.REQUIRED)Transactional(propagation = Propagation.NEWSTED)methodB()单独调methodB法,则按REQUIRED属性执。如果调methodA法,则相当于: con = getConnection();con.setAutoCommit(f

16、alse);doSomeThingA();savepoint = con2.setSavepoint();try/释放资源当methodB法调之前,调setSavepoint法,保存当前的状态到savepoint。如果methodB法调失败,则恢复到之前保存的状态。需要注意的是,这时的事务并没有进提交,如果后续的代码(doSomeThingB()法)调失败,则回滚包括methodB法的所有操作。嵌套事务个常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。内层事务操作失败并不会引起外层事务的回滚。Spring事务的隔离级别事务隔离级别定义TransactionDefinitionint ISOLATION_DEFAULT = -1;int ISOLATION_READ_UNCOMMITTED = 1;int ISOLATION_READ_COMMITTED = 2;int ISOLATION_REPEATABLE_READ = 4;int ISOLATION_SERIALIZABLE = 8;隔离级别解释这是个 PlatfromTransactionManager 默认的隔离级别, 使数据库默认的事务隔离级别。另外四个与 JDBC的 隔离级别相对应。ISOL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论