spring事务的传播属性,数据库事务特征,隔离级别

来源:互联网 发布:js汉字转unicode编码 编辑:程序博客网 时间:2024/05/22 00:18

一.Spring的7个事务的传播行为属性

1.REQUIRED(必须的)

       业务方法需要在一个事务中运行,如果已经处在了一个事务中,那么就加入该事务,否则创建一个新的事务,这也是Spring默认的事务传播行为。

2.SUPPORTS(支持的)

        如果业务方法在某个事务范围内被调用,那么该方法加入该事务,如果业务方法在事务范围外被调用,那么该业务方法将在没有事务的环境下执行。

3.MANDATORY(托管的,强制的)

        业务方法只能在已经存在的事务中执行,业务方法不能发起新的事务,如果业务方法在事务范围外被调用,将抛出异常。

4.REQUERES_NEW

        业务方法总是会为自己创建发起一个新的事务,如果方法已经运行在一个事务中,那么旧的事务会被挂起,业务方法发起新的事务,知道方法执行结束,新事务提交,旧的事务才会继续恢复执行。

5.NOT_SUPPORTED

        如果业务方法被一个已经存在的事务调用,那么还事务会被挂起,直到业务方法执行结束

6.NEVER

        业务方法绝对不能在事务中执行,如果在事务环境中执行,容器会抛出异常,只有没有关联到事务,才能正常执行。

7NESTED(嵌套的)

         如果活动的事务已经存在,则运行在一个嵌套的事务中,如果不存在,执行方式将和REQUIRED相同,运行在嵌套的事务中时,内部事务的回滚对外部事务没有影响。

二.数据库事务的四大特性

1.原子性(Atomicity)

      每一个事务都是不可分割的最小单位,一个事务中包含的所有操作要么全部执成功,要么全部失败回滚。

2.一致性(Consistensy)

      一致性是指一个事务执行前后,数据库的状态必须是由一个一致性状态到另一个一致性状态,举个例子:账户A中有1000,账户B中有2000,从A中转500给账户B,转账前后,A,B总额一直为3000。

3.隔离性(Isolation)

      是指当多个用户并发访问同一个数据库,修改统一张表,数据库会为每个用户开启一个独立的事务,多个事务相互隔离,每个事务都察觉不到有别的事务存在。

4.持久性(Durability)

      持久性是指,一个事务一旦提交,那么对数据可的操作将会持久化,即便数据库出现故障也不会影响已经提交的事务。

三.数据库事务的隔离级别

1.ISOLATION_READ_UNCOMMITTED (读取未提交数据)

     这是数据库的最低隔离级别,此隔离级别会出现(脏读,不可重复读,幻读,避免了 丢失更新)

2.ISOLATION_READ_COMMITTED (读取已提交数据)

     保证了一个事务提交后的数据才能被另一个事务读取,另外一个事务不能读取该事务的未提交数据。会出现(不可重复读,幻读,避免了脏读,丢失更新)。SqlServer,Oracle默认使用。

3.ISOLATION_REPEATABLE_READ(可重复读)

     保证了读取已经提交的数据,还保证可重复读取数据。会出现(幻读,避免了不可重复读,脏读,丢失更新)。MySql默认使用。

4.ISOLATION_SERIALIZABLE(串行化)

     隔离级别最高,但是话费的代价也最高,事务被处理为顺序执行,避免了幻读,不可重复读,脏读,丢失更新。

丢失更新

       当两个或多个事务选择同一行,选定最初值进行更新操作时,会发生丢失更新问题。比如事务A和事务B同时修改某个值0,事务A将值修改为1并提交,然后事务B不知到A存在,把0更新为2提交。此时A事务所做的更新操作将会丢失。解决办法:对要修改的行枷锁,只能并发发生一个事务。

脏读

        一个事务读到另一个事务未提交的数据,比如事务A修改一个值,原始值为0,A将值修改为2,事务未提交;而事务B本应该读取的值为0,可是读到的确是2,如果是钱,悲催了!!!

不可重复读

        一个事务中,多次读取同一数据,返回的结果有所不同,换句话说就是 后续读取可以读到前一个事务已经提交的更新数据,相反“可重复读”在同一事务中读取数据时,能够保证多次读取的通过数据一样,也就是读不到别的事务在本次读取事务中间提交的更新。

幻读  

     一个事务读取到了另一个事务已提交的insert数据,举个例子:当前事务对表中的所有行进行修改,此时事务还未提交,另一个事务插入了一条数据并提交,这时第一个事务读取表中的数据时发现有一条没有修改的数据,好像幻觉一般。





文章参考:http://elf8848.iteye.com/blog/345360

http://www.cnblogs.com/hustcat/archive/2009/10/18/1585626.html

http://blog.jobbole.com/24006/

原创粉丝点击