zoukankan      html  css  js  c++  java
  • 事物

    什么是事务

    事务指的是逻辑上的一组操作,组成这组操作的各个逻辑单元要么一起成功,要么一起失败.

    MYSQL的事务的管理

    创建一个账号的表:
    create database web_13;
    use web_13;
    create table account(
        id int primary key auto_increment,
        name varchar(20),
        money double
    );
    insert into account values (null,'张森',10000);
    insert into account values (null,'凤姐',10000);
    insert into account values (null,'如花',10000);

    MYSQL的事务管理有两种方式:(MYSQL数据库事务默认是自动提交的.Oracle数据库事务默认是不自动提交)
    * 1.手动开启事务
    * start transaction; -- 开启事务
    * 多条sql;
    * commit/rollback;

    * 2.设置一个自动提交参数
    * show variables like '%commit%'; -- 查看与commit相关参数.
    * set autocommit = 0; -- 将autocommit参数设置为OFF.

    JDBC中的事务管理

    JDBC的事务的管理的API: Connection
    void setAutoCommit(boolean autoCommit)
              将此连接的自动提交模式设置为给定状态。
    void commit()
              使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。
    void rollback()
              取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。

    DBUtils实现事务管理

    没有事务管理:
    QueryRunner(DataSource ds)
        Constructor for QueryRunner that takes a DataSource to use.
    <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
        Executes the given SELECT SQL query and returns a result object.
    int update(String sql, Object... params)
        Executes the given INSERT, UPDATE, or DELETE SQL statement.

    有事务管理:
    QueryRunner()
        Constructor for QueryRunner.
    <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
        Execute an SQL SELECT query with replacement parameters.
    int update(Connection conn, String sql, Object... params)
        Execute an SQL INSERT, UPDATE, or DELETE query.

    事物的特性

    原子性:强调事务的不可分割.
    一致性:强调的是事务的执行的前后,数据的完整性要保持一致.
    隔离性:一个事务的执行不应该受到其他事务的干扰.
    持久性:事务一旦结束(提交/回滚)数据就持久保持到了数据库.

    事物的作用:事物是为解决数据安全提出的,事物控制实际上就是控制数据的安全访问。

    如果不考虑事务的隔离性,引发一些读问题

    脏读:一个事务读到另一个事务还没有提交的数据。
    不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致在当前的事务中多次查询结果不一致。
    虚读/幻读:一个事务读到另一个事务已经提交的insert的数据,导致在当前的事务中多次的查询结果不一致。

    解决引发的读问题,设置事务的隔离级别

    read uncommitted:未提交读.脏读,不可重复读,虚读都可能发生。
    read committed:已提交读.避免脏读.但是不可重复读和虚读有可能发生。
    repeatable read:可重复读.避免脏读,不可重复读.但是虚读有可能发生。
    serializable:串行化的.避免脏读,不可重复读,虚读的发生。

    MYSQL隔离级别:repeatable read  Oracle隔离级别:read committed

  • 相关阅读:
    Elasticsearch之优化
    前端页面加载速度优化---Ngnix之GZIP压缩
    Nginx的try_files使用详解
    elk6.3.2在线安装中文分词工具IK
    filebeat5与filebeat6配置index的差异
    十分钟部署Anemometer作为Mysql慢查询可视化系统
    虚拟机磁盘逻辑卷扩容
    十分钟搭建和使用ELK日志分析系统
    关于NODEJS性能测试和优缺点总结
    十分钟搭建和使用sonarqube代码质量管理平台
  • 原文地址:https://www.cnblogs.com/boomoom/p/10447902.html
Copyright © 2011-2022 走看看