zoukankan      html  css  js  c++  java
  • 数据库事务整理

      1.首先是事务的概念:是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。举个例子:比如银行转账问题,A给B转账100块钱,应该是要分为两步操作,第一显示A的余额-100,再就是B的余额+100,这两个操作要么都成功,要不都不能成功,这两个操作是一个不可拆分的,也就是下面说的原子性。

      2.再就是事务的四大特性:原子性,一致性,隔离性,持久性。

      3.如果在没有多线程控制机制的情况下,多个事务并发执行,会发生以下几个问题:

        脏读:A事务读取数据库的某条记录,但是这条记录是B事务更新未提交的,所以,A事务读取的数据很可能因为B事务回滚而导致数据不正确。

        不可重复读:A事务连续读取数据库的某条已被提交的记录,但是B事务在A事务读取的间隙又对该记录更新并提交了,A事务读取的多次数据就会不正确。

        幻读:

      4.对于处理以上四种情况,有四个级别的处理方案:Read Uncommitted,Read Committed,Repeatable Read,serializable(读未提交、读已提交、可重复读、串行化)

        Read UnCommitted:事务的各种问题均无法避免,因为数据库允许某事物读取未提交的数据。

        Read Committed: 可以防止脏读,因为数据库只允许事务读取的时候读取已提交的数据,因此数据库不得不采用锁,此级别锁行。

        Repeatable Read:可以防止脏读和不可重复读问题,因为此级别下某事物读取数据将会禁止写数据的其他事务(但允许读事务),写事务则禁止任何其他事。

        Serializable: 最狠的一种,要求每个事务已串行化的方式进行执行,A事务不结束B事务不能开始,知道A事务完成才行。

        注意:四大隔离级别从上到下越来越安全,安全的代价就是性能,为了防止多线程事故,数据库只能加锁,这就限制了性能,而且还可能出现死锁,所以

        选用隔离级别的候要小心选用。

      5.常见数据库的隔离级别

        mysql具有四大隔离级别,默认为Read Committed,设置隔离级别语句为:

        SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

        Oracle中只有两隔离级别:Read Committed和Serializable,默认为Read Committed。

  • 相关阅读:
    LeetCode 32. 最长有效括号(Longest Valid Parentheses)
    LeetCode 141. 环形链表(Linked List Cycle)
    LeetCode 160. 相交链表(Intersection of Two Linked Lists)
    LeetCode 112. 路径总和(Path Sum)
    LeetCode 124. 二叉树中的最大路径和(Binary Tree Maximum Path Sum)
    LightGBM新特性总结
    sql service 事务与锁
    C#泛型实例详解
    C# 中的委托和事件(详解)
    C# DateTime日期格式化
  • 原文地址:https://www.cnblogs.com/WreckBear/p/5793806.html
Copyright © 2011-2022 走看看