对事务的理解

1、事务首先是作用于数据库上的,可以是一条SQL语句,也可以是多条,甚至是整个程序。
事务就是对一系列的数据库操作进行统一的提交或回滚 。
在JDBC中是通过Connection对象进行事务管理的,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。
Hibernate中是通过Transaction进行事务管理,处理方法与JDBC中类似。
Spring中也有自己的事务管理机制,使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。

2、事务并发问题:(前提是多个事务同时操作,而不是针对一个事务中来说的)
   **脏读:一个事务读取到另一个事务的未提交数据。
   **不可重复读:对同一记录的两次读取不一致,因为另一事务对该记录做了修改
   **幻读:对同一张表的两次查询不一致,因为另一事务插入了一条记录;
3、隔离级别:
   ** SERIALIZABLE(串行化)
      不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
      性能最差;
   ** REPEATABLE READ (可重复读)(MySQL)
      防止脏读和不可重复读;
      性能比SERIALIZABLE好
   ** READ COMMITTED (读已提交数据)(Oracle)
      防止脏读;
      性能比REPEATABLE READ好
   ** READ UNCOMMITTED (读未提交数据)
4、如何理解不可重复读和可重复读:
   不可重复读(变化):一个事务对同一记录的读取不一致,这是因为另一事务对该记录做了修改。 一个事务A一旦开启并读取数据,另 一    个事务 B对数据做了修改操作(已提 交),这 个事务A再次读取数据就是事务B修改后的数据。
   可重复读(不变):是MySQL的默认隔离级别,它的意思是一个事务A一旦开启并读取数据,另一个事务B即使对数据做了修改操作 (已 提     交),这 个事务A再次读取数据跟之前是一样的,不会因为事务B对数据进行了修改而改变。

5、(自己的理解)
    **对于事务就是把多条SQL语句放在一起,要么成功都执行,要么失败回滚(回滚到保存点不算是提交事务,但是回滚整 个过程    是提交事务)。
    **即便不是手动添加事务,其实数据库会自动添加事务(MySQL每一条语句就是一个事务),且这个事务的read—only的默 是    false,所以可以进行增删改查。手工添加事务若不指定read-only,默认依旧是false。
    **只读事务可以理解为:
   概念:从这一点设置的时间点开始(时间点a)到这个事务结束的过程中,其他事务所提交的数据,该事务将看不见!   
     (查询中不会 出现别人在时间点a之后提交的数据)。
   如果只是一条查询语句,那么不必手动开启事务,mysql默认支持SQL执行期间的读一致性。
   若是多条查询语句,则需要开启 只读事务。例如统计查询,报表查询,在这种场景下,多条查询SQL必须保证整体的读一致性 则,在前     条SQL查询之后,后条SQL查询之前,数据被 其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态。
**关于在SSH框架中的service层添加@transaction的事务注解的解释。
如果配置了OpenSessionInViewFilter,那么如果不在service层添加事务注解,这个过滤器检测不到这个注解,就会自动把默认 的事务   的read-only变为true( Flush.NEVER) ,这个时候进行增删改操作就会报出 只读错误 。如果添加了注解,那么会自动的 read-only变为   自动,增删改为false,查询为true。(由Flush.NEVER变为Flush.AUTO)
  若没有配置 OpenSessionInViewFilter ,那么这个时候即便不在service层添加事务注解,默认的事务read-only为false,则进 行增删改   不会报只读错误。
  网上的解释:
      
 ** 只读事务并不是改变数据库为只读模式,而是本身不能含有增删改语句。
 
6、事务的特性:ACID
   原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
   一致性 (Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两 
   个账号余额之和应该是不变的。(最重要)
   隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。--隔离级别
   持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩
   溃,在数据库重启时,也必须能保证通过某种机制恢复数据。
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值