Java事务

来源:互联网 发布:淘宝背景怎么下调 编辑:程序博客网 时间:2024/06/08 03:20

思路解析:总体上来说,事务本身要求就是对一次存储数据正确的处理,所以有原子性;在存储过程中,我们要求事务和数据库的同步,所以有一致性,与此同时我们要求每个未完成的事务不作为真实数据呈现给系统(或者其它事务),所以有隔离性;最后我们完成事务操作过后要求完成数据存储并且长久有效,所以有持久化。

详细内容:事务的原子性:事务要么全部执行,要么全部失败(回滚)------事务的子事务失败的时候,整个事务都失败;

    事务的一致性(可串化):事务的执行使得数据库从一种正确状态转换成另一种正确状态------事务状态改变时引起数据库的状态改变;

    事务的隔离性:每个事务正确提交之前,它所做的操作不应该被其它事务获取和操作------单个事务的执行过程中不被其它事务获取;

      事务的持久化:事务在正确提交以后,其结果正确的保存在数据库中------事务执行过后又其它错误不影响数据库中的内容。

附加:事务的提交模式:自动提交和手动提交;

同时有多个事务同时访问同一个数据时可能会造成的问题:撤销一个事务的时候同时撤销其它事务的更新或者一个事务覆盖另一个事务已提交的更新;

脏读:读取未提交的数据;

虚读:读取另一个事务新插入的数据;

不可重复读:一个事务读到另一个事务已提交的更新数据;

隔离级别:悲观锁:在应用中显示的加锁来强制避免事务可能出现的问题;
    乐观锁:完全依靠隔离级别来操作。

附加:
hibernate事务
jdbc类型的事务:即是调用jdbc的connection的方式使用事务,在配置文件中配置过后需要在程序代码中手动的设置事务的开始、提交、关闭和回滚。(在配置过后,如果没有设置事务自动提交方式,默认为自动提交)
jta类型的事务:即是让session可以跨平台、跨数据库的使用,在配置文件中配置此文件过后也需要手动设置,要注意使用此种方式的时候必须注意在一个方法中引用其它方法的时候,子级方法不要声明事务,否则会出现事务的二次申请而出错。
ps:hibernate事务在声明时,有几个传播类型,如下
1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启;
2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行;
3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常;
4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起;
5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务;
6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常;
7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。
spring事务:
Spring的事务框架设计理念的基本原则是:让事务管理的关注点与数据访问关注点相分离。
1.当在业务层使用事务的抽象API进行事务界定的时候,不需要关心事务将要加诸于上的事务资源是什么,对不同的事务资源的管理将由相应的框架实现类来操心;
2.当在数据访问层对可能参与事务的数据资源进行访问的时候,只需要使用相应的数据访问API进行数据访问,不需要关心当前的事务资源如何参与事务或者是否需要参与事务。这同样将由事务框架类来打理。
从而把数据和事务分离开,从而使service层处理事务管理(当一个事务要处理多个数据处理办法时,我们需要使所有的数据调用使用同一个事务,就需要它们使用同一个connection),使Dao层处理数据。
TransactionDefinition内定义了如下5个常量用于标志可供选择的隔离级别:
1.ISOLATION_DEFAULT。如果指定隔离级别为ISOLATION_DEFAULT,则表示使用数据库默认的隔离级别,通常情况下是Read?Committed;
2.ISOLATION_READ_UNCOMMITTED。对应Read?Uncommitted隔离级别,无法避免脏读,不可重复读和幻读;
3.SOLATION_READ_COMMITTED。对应Read?Committed隔离级别,可以避免脏读,但无法避免不可重复读和幻读;?
4.ISOLATION_REPEATABLE_READ。对应Repeatable?read隔离级别,可以避免脏读和不可重复读,但不能避免幻读;
5.ISOLATION_SERIALIZABLE。对应Serializable隔离级别,可以避免所有的脏读,不可重复读以及幻读,但并发性效率最低。
TransactionDefinition接口中定义了七个事务传播行为:
1.PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务;
2.PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器;4.PROPAGATION_SUPPORTS与不使用事务有少许不同;
3.PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常;
4.PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起;
5.PROPAGATION_NOT_SUPPORTED  总是非事务地执行,并挂起任何存在的事务;
6.PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常;
7.PROPAGATION_NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED属性执行。
spring的AOP处理事务方面非常优秀。而这个框架致力于中间对象的处理,对各个层进行解耦合。
0 0
原创粉丝点击