事务&安全问题&隔离级别

事务

transaction,指一组操作,里面包含许多单一逻辑,只要一个逻辑没有执行成功,那么都算失败。所有的数据都回到最初的状态(回滚)。

为什么要有事务?

确保逻辑的成功,例子:银行转账

事务针对连接。

 

事务的开始和结束:start transaction --> commit/rollback;

 

 

测试事务:

代码里面的事务,主要是针对连接

  • 关闭自动提交:conn,setAutoCommit(false);
  • 提交:conn.commit , 一旦提交,数据库里面的数据会发生变化
  • 回滚:conn.rollback   让上次执行的操作无效

 

public class TestDemo {

    @Test
    public void transaction()   {
         Connection conn = null;
         PreparedStatement ps = null;
         ResultSet rs = null;
        try {    
            conn = JDBCUtil.getConn();
            //连接,关闭事务默认自动提交
            conn.setAutoCommit(false);
            String sql = "update account set money = money - ? where id = ?";
            ps  =  conn.prepareStatement(sql); 
            //给id为1的减100
            ps.setInt(1, 100);
            ps.setInt(2, 1);
            ps.executeUpdate();
            
//            int a = 10/0;
            
            //给id为2 的加100
            ps.setInt(1, -100);
            ps.setInt(2, 2);
            ps.executeUpdate();
            
            //成功则提交事务
            conn.commit();
        /*    while(rs.next()){
              System.out.println(rs.getString("name")+":"+rs.getDouble("money"));
              }*/
        } catch (SQLException e) {
            //失败则回滚
            try {
                conn.rollback();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            JDBCUtil.release(conn, ps, rs);
        }
          
          
    }
}

 

 

事务的特点ACID(面):

原子性:指的是事务中包含的逻辑不可分割

一致性:指的是事务执行前后,数据的完整性一致

隔离性:事务在执行期间不应该受到其他事务的影响

持久性:事务执行结束,事务应该永久保存到磁盘上。

 

安全问题&隔离级别(面):

事务的安全隐患 :

读:

  • 脏读:一个事务读到另外一个事务还未提交的数据
  • 不可重复读:一个事务读到了另外一个事务提交的数据,造成前后两次查询结果不一致
  • 幻读:一个事务读到了另一个事务已提交的插入的数据,导致前后查询结果不一致

 

写:丢失更新(新提交的事务覆盖上一次提交的事务做出的修改)

 

 

 

 

 

 

 

 

隔离级别:

  • (Read Uncommitted)读未提交:引发“脏读”,一个事务可以读到另一个事务还未提交的数据,读取到的是数据库内存中的数据,而非真的磁盘上的数据。
  • (Read Committed)读已提交:解决脏读,引发“不可重复读”。只能读取到其他事务已经提交的数据,那些没有提交的数据读不到,造成:前后读取结果不一样。多 次读取结果不同,不可重
  • (Repeatable Read)可重复读:解决脏读、不可重复读,未解决:幻读。让事务在会话中重复读取数据,并且不会出现结果不一样的情况,即使其他事务已经提交,还是显示以前的数据。
  • 可串行化(Serializable):能解决脏读、不可重复读、幻读。谁先打开事务,谁就有先执行的权利,后打开的事务只能等先打开的事务提交或者回滚后才能执行。效率低,容易造成性能问题,用得少。
  • 效率排序:
  • 默认的隔离级别:读未提交>读已提交>重读读>可串行化
  • MySQL:Repeatable 重复读
  • Oracal :Read Committed 读已提交

 

posted @ 2019-01-05 22:24  IslandZzzz  阅读(421)  评论(0编辑  收藏  举报