zoukankan      html  css  js  c++  java
  • JDBC事务

    事务概述
    事务指的是逻辑上的一组操作(多条sql语句),组成这组操作的各个单元要么全都成功,要么全都失败.

    事务的作用
    保证在一个事务中多次操作要么全都成功,要么全都失败.

    mysql事务操作
    Connection接口中有和事务有关的方法:
    void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。
    autoCommit - 为 true 表示启用自动提交模式;为 false 表示禁用自动提交模式
    要把autoCommit设置为false,让事务手动开启
    void commit() 如果多条sql都执行成功,提交事务
    void rollback() 有一条sql执行失败,就回滚事务,把数据回滚到开启事务之前的状态

    代码实现

     1 public class Demo01Account {
     2     public static void main(String[] args) {
     3         Connection conn = null;
     4         Statement stat = null;
     5         try {
     6             //注册驱动
     7             Class.forName("com.mysql.jdbc.Driver");
     8             //获取连接
     9             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day06", "root", "root");
    10             //开启事物
    11             conn.setAutoCommit(false);
    12             //获取执行者对象
    13             stat = conn.createStatement();
    14             int i = stat.executeUpdate("update account set money=money-100 where name='tom'");
    15             int num = 0/0;//tom钱减少了,jerry钱没有增加
    16             int j = stat.executeUpdate("update account set money=money+100 where name='jerry'");
    17             if(i>0 && j>0){
    18                 System.out.println("转账成功!");
    19             }
    20             //提交事物
    21             conn.commit();
    22         } catch (Exception e) {
    23             e.printStackTrace();
    24             //回滚事物
    25             try {
    26                 conn.rollback();
    27             } catch (SQLException e1) {
    28                 e1.printStackTrace();
    29             }
    30         }finally{
    31             if (stat != null){
    32                 try {
    33                     stat.close();
    34                 } catch (Exception e) {
    35                     e.printStackTrace();
    36                 }
    37             }
    38             if (conn != null){
    39                 try {
    40                     conn.close();
    41                 } catch (Exception e) {
    42                     e.printStackTrace();
    43                 }
    44             }
    45         }
    46         
    47     }
    48 }

     事务的特性

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

    如果不考虑事务的隔离性,引发一些安全性问题
    脏读:一个事务读到另一个事务还没有提交的数据.
    脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的
    不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致在当前的事务中多次查询结果不一致.
    虚读/幻读 :一个事务读到另一个事务已经提交的insert的数据,导致在当前的事务中多次的查询结果不一致.

    解决引发的读问题
    设置事务的隔离级别:级别超高,越安全,效率越低。
    1 read uncommitted :未提交读.脏读,不可重复读,虚读都可能发生.
    2 read committed :已提交读.避免脏读.但是不可重复读和虚读有可能发生.(Oracle默认)
    4 repeatable read :可重复读.避免脏读,不可重复读.但是虚读有可能发生.(MySql默认)
    8 serializable :串行化的.避免脏读,不可重复读,虚读的发生.

  • 相关阅读:
    Sending post
    <<the not so short introduction to Latex2e >> 读书笔记
    Latex 书签中文乱码解决方案
    VisualSVN迁移到其他服务器 子曰
    C#遍历DataSet中数据的几种方法总结 子曰
    Extjs formpanel加载数据的两种方式 子曰
    向老销售取经,学来的一点软件销售技巧 子曰
    extjs 实现 NumberField 即时计算 子曰
    Ext.form.DateField简单用法及日期范围控制 子曰
    解决.aspx中插入浮动广告不滚动问题 子曰
  • 原文地址:https://www.cnblogs.com/caigq/p/7049276.html
Copyright © 2011-2022 走看看