zoukankan      html  css  js  c++  java
  • 数据库事物讲解

    1.一组操作,要么全部成功,要么全部失败。

    2.数据库默认事物是自动提交的,即发一条sql就执行一句,如果想让多条sql放在一个事物中,需要手动开启事物和提交事物

    start transaction :开启事务

    • rollback:回滚事务
    • commit:提交事务

    3.事物是数据库提供的属性,在java代码中,通过connection开启,提交或回滚事物。操作的都是数据库中的事物属性。

    4.当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,可使用下列的JDBC控制事务语句:

    • Connection.setAutoCommit(false); //开启事务(start transaction)
    • Connection.rollback(); //回滚事务(rollback)
    • Connection.commit(); //提交事务(commit)

    5.事物的四大特性:

    原子性:不可分割,要么全部成功,要么全部失败

    一致性:以转账为例,转出去的钱和收到的钱必须是一样的

    持久性:

    隔离性:根据两个事物之间的相互影响程度,分为不同的隔离级别,不同的级别,两个事物之间的影响程度也不同。

    多个线程开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个线程在获取数据时的准确性。

    6.隔离级别带来的问题:

    脏读:对应的隔离级别是读未提交。即一个事物里操作了数据,但还没有提交,另一个事物就可以读取操作后的数据了。容易造成套现现象

    不可重复读:一个事物在读取某一行数据时,多次读取的结果不同(读取了别的事物已经提交的数据)。如果想实时读取更新的数据,那么不可重复读就不是一个存在的问题,如果不想实时的读取更新数据,那么不可重复读就是一个问题。在此需要注意的是,在一次事物中重复的读取某一条数据,而数据在不断变化。隔离级别设置成可重复读可以解决此问题。

    举例:比如银行程序需要将查询结果分别输出到电脑屏幕和写到文件中,结果在一个事务中针对输出的目的地,进行的两次查询不一致,导致文件和屏幕中的结果不一致,银行工作人员就不知道以哪个为准了。

    虚读(幻读):一个事物在查询某个范围段的数据时,多次读取的数据条数不一致。造成原因是另一个事物在这个范围段内插入了数据,所以多了记录条数。不可重复读是一条数据的不可重复读,虚读是一个范围段内的数据多了记录条数。隔离级别调到串行化可以解决此问题。

    隔离级别:读未提交,读已提交,可重复读,串行化

    7.MySQL默认的隔离级别为REPEATABLE-READ,并且是严格遵循数据库规范设计的,即支持4种隔离级别;Oracle默认的隔离级别为Read committed,并且不支持这4种隔离级别,只支持这4种隔离级别中的2种,Read committed和Serializable

  • 相关阅读:
    漫谈设计模式(三):桥接(Bridge)模式 —— 将类功能、结构两层次分离
    深入理解spring中的AOP原理 —— 实现MethodInterceptor接口,自已动手写一个AOP
    Python面向对象之什么是类(1)
    Python常用模块之logging模块
    Python常用模块之xml模块
    Python常用模块之hashlib
    linux基础命令(一)
    DateTime字段控件值显示短格式的做法
    .net中除去IList中的多余项
    jquery点击按钮显示和隐藏DIv
  • 原文地址:https://www.cnblogs.com/hongyuansu/p/8446305.html
Copyright © 2011-2022 走看看