﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-巷尾的酒吧-随笔分类-spring</title><link>http://www.blogjava.net/abin/category/53882.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 08 Sep 2013 19:49:36 GMT</lastBuildDate><pubDate>Sun, 08 Sep 2013 19:49:36 GMT</pubDate><ttl>60</ttl><item><title>事务相关知识点积累</title><link>http://www.blogjava.net/abin/archive/2013/09/08/403820.html</link><dc:creator>abing</dc:creator><author>abing</author><pubDate>Sun, 08 Sep 2013 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/abin/archive/2013/09/08/403820.html</guid><wfw:comment>http://www.blogjava.net/abin/comments/403820.html</wfw:comment><comments>http://www.blogjava.net/abin/archive/2013/09/08/403820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/abin/comments/commentRss/403820.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/abin/services/trackbacks/403820.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px; -webkit-text-decorations-in-effect: initial; background-color: #ffffff;"><h1><span style="font-size: 14pt;">数据库系统中事务的ACID原则是什么啊？？<br /></span><span style="font-size: 14px; font-weight: normal; -webkit-text-decorations-in-effect: initial; background-color: #f1fedd;"><pre id="best-content-19403728" accuse="aContent"  mb-10"="" style="margin-top: 0px; margin-bottom: 10px; padding: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word;">事务的原子性、一致性、独立性及持久性<br />事务的原子性是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成.<br />事务的一致性是指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.<br />事务的独立性是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.<br />事务的持久性是指事务运行成功以后,就系统的更新是永久的.不会无缘无故的<a decor-none"="" href="http://zhidao.baidu.com/search?word=%BB%D8%B9%F6&amp;fr=qb_search_exp&amp;ie=gbk" target="_blank" rel="nofollow" data-word="0" style="color: #2d64b3; text-decoration: none; ">回滚</a>.<br /><br /><h3></h3></pre></span><div>spring事务传播属性和隔离级别</div><div style="color: #000000; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; font-weight: normal; line-height: 25.1875px;"><span style="font-size: large;">1 事务的传播属性（Propagation）&nbsp;<br /><br />1) REQUIRED ，这个是默认的属性&nbsp;<br />Support a current transaction, create a new one if none exists.&nbsp;<br />如果存在一个事务，则支持当前事务。如果没有事务则开启一个新的事务。&nbsp;<br />被设置成这个级别时，会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务，那么后面的方法支持当前的事务，如果当前没有事务会重新建立事务。&nbsp;<br />如图所示：&nbsp;<br /><br />2) MANDATORY&nbsp;<br />Support a current transaction, throw an exception if none exists.支持当前事务，如果当前没有事务，就抛出异常。&nbsp;<br /><br />3) NEVER&nbsp;<br />Execute non-transactionally, throw an exception if a transaction exists.&nbsp;<br />以非事务方式执行，如果当前存在事务，则抛出异常。&nbsp;<br /><br />4) NOT_SUPPORTED&nbsp;<br />Execute non-transactionally, suspend the current transaction if one exists.&nbsp;<br />以非事务方式执行操作，如果当前存在事务，就把当前事务挂起。&nbsp;<br /><br />5) REQUIRES_NEW&nbsp;<br />Create a new transaction, suspend the current transaction if one exists.&nbsp;<br />新建事务，如果当前存在事务，把当前事务挂起。&nbsp;<br />如图所示：&nbsp;<br /><br />6) SUPPORTS&nbsp;<br />Support a current transaction, execute non-transactionally if none exists.&nbsp;<br />支持当前事务，如果当前没有事务，就以非事务方式执行。&nbsp;<br /><br />7) NESTED&nbsp;<br />Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else.&nbsp;<br />支持当前事务，新增Savepoint点，与当前事务同步提交或回滚。&nbsp;<br />嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时，会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。&nbsp;<br /><br />8) PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别&nbsp;<br />它们非常 类似,都像一个嵌套事务，如果不存在一个活动的事务，都会开启一个新的事务。使用PROPAGATION_REQUIRES_NEW时，内层事务与外层事务就像两个独立的事务一样，一旦内层事务进行了提交后，外层事务不能对其进行回滚。两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA 事务管理器的支持。&nbsp;<br />使用PROPAGATION_NESTED时，外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚，它是一个真正的嵌套事务。&nbsp;<br /><br />2 事务的隔离级别（Isolation Level）&nbsp;<br /><br />1) 首先说明一下事务并发引起的三种情况&nbsp;<br /><br />i. Dirty Reads 脏读&nbsp;<br />一个事务正在对数据进行更新操作，但是更新还未提交，另一个事务这时也来操作这组数据，并且读取了前一个事务还未提交的数据，而前一个事务如果操作失败进行了回滚，后一个事务读取的就是错误数据，这样就造成了脏读。</span></div><div style="color: #000000; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; font-weight: normal; line-height: 25.1875px;"><div><br /><span style="font-size: large;">ii. Non-Repeatable Reads 不可重复读&nbsp;<br />一个事务多次读取同一数据，在该事务还未结束时，另一个事务也对该数据进行了操作，而且在第一个事务两次次读取之间，第二个事务对数据进行了更新，那么第一个事务前后两次读取到的数据是不同的，这样就造成了不可重复读。</span></div><div><br /><span style="font-size: large;">iii. Phantom Reads 幻像读&nbsp;<br />第一个数据正在查询符合某一条件的数据，这时，另一个事务又插入了一条符合条件的数据，第一个事务在第二次查询符合同一条件的数据时，发现多了一条前一次查询时没有的数据，仿佛幻觉一样，这就是幻像读。</span></div><div><br /><span style="font-size: large;">iv. 非重复度和幻像读的区别&nbsp;<br />非重复读是指同一查询在同一事务中多次进行，由于其他提交事务所做的修改或删除，每次返回不同的结果集，此时发生非重复读。(A transaction rereads data it has previously read and finds that another committed transaction has modified or deleted the data. )</span></div><div><br /><span style="font-size: large;">幻像读是指同一查询在同一事务中多次进行，由于其他提交事务所做的插入操作，每次返回不同的结果集，此时发生幻像读。(A transaction reexecutes a query returning a set of rows that satisfies a search condition and finds that another committed transaction has inserted additional rows that satisfy the condition. )</span></div><div><br /><span style="font-size: large;">表面上看，区别就在于非重复读能看见其他事务提交的修改和删除，而幻像能看见其他事务提交的插入。&nbsp;<br /><br />2) DEFAULT （默认）&nbsp;<br />这是一个PlatfromTransactionManager默认的隔离级别，使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应&nbsp;<br /><br />3) READ_UNCOMMITTED （读未提交）&nbsp;<br />这是事务最低的隔离级别，它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读，不可重复读和幻像读。&nbsp;<br /><br />4) READ_COMMITTED （读已提交）&nbsp;<br />保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现，但是可能会出现不可重复读和幻像读。&nbsp;<br /><br />5) REPEATABLE_READ （可重复读）&nbsp;<br />这种事务隔离级别可以防止脏读，不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外，还保证了不可重复读&nbsp;<br /><br />6) SERIALIZABLE（串行化）&nbsp;<br />这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读，不可重复读外，还避免了幻像读。&nbsp;<br /><br />7) 隔离级别解决事务并行引起的问题&nbsp;<br />Dirty reads non-repeatable reads phantom reads&nbsp;<br />Serializable 不会 不会 不会&nbsp;<br />REPEATABLE READ 不会 不会 会&nbsp;<br />READ COMMITTED 不会 会 会&nbsp;<br />Read Uncommitted 会 会 会</span></div></div><br /><br /><br /><br /><br /><span style="color: #000000"><span style="font-size: medium">事务的隔离级别 </span><br /><br />注：Spring中事务的隔离级别是由数据库实现的  </span><br /><br /><strong>ISOLATION_DEFAULT </strong><br />&nbsp;&nbsp;&nbsp;  这是一个PlatfromTransactionManager默认的隔离级别，使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应  <br />ISOLATION_READ_UNCOMMITTED  这是事务最低的隔离级别，它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读，不可重复读和幻像读  <br /><br /><strong>ISOLATION_READ_COMMITTED</strong> <br />&nbsp;&nbsp;&nbsp;  保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现，但是可能会出现不可重复读和幻像读。  <br /><br /><strong>ISOLATION_REPEATABLE_READ</strong> <br />&nbsp;&nbsp;&nbsp;  这种事务隔离级别可以防止脏读，不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外，还保证了避免下面的情况产生(不可重复读)。  <br /><br /><strong>ISOLATION_SERIALIZABLE </strong><br />&nbsp;&nbsp;&nbsp;  这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读，不可重复读外，还避免了幻像读。 <br /><br /><span style="color: red">脏读：</span> <br />&nbsp;&nbsp;&nbsp; 一个事务读取到另一个事务未提交的更新数据。 <br /><span style="color: red">不可重复读：</span> <br />&nbsp;&nbsp;&nbsp;  在同一事务中，多次读取同一数据返回的结果有所不同，即后续读取可以读取到另一事务已提交的更新数据；相反，"可重复读"是指在同一事务中多次读取数据时，能够保证所读取的数据是一样，即后续读取不能读到另一事务已提交的数据。  <br /><span style="color: red">幻读：</span> <br />&nbsp;&nbsp;&nbsp; 一个事务读取到另一事务已提交的insert数据。&nbsp;<br /></h1></span><img src ="http://www.blogjava.net/abin/aggbug/403820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/abin/" target="_blank">abing</a> 2013-09-08 17:00 <a href="http://www.blogjava.net/abin/archive/2013/09/08/403820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>