1、概述

  1.1  事务:在对业务相关的一系列数据进行操作时,需要保证数据操作的完整性(要么全部成功、要么全部失败);

  1.2  MySQL中支持事务的存储引擎是:Innodb;

  1.3  事务用来管理insert、update、delete语句;

  1.4  事务必须满足的4个条件(ACID):

      1.1.1  Atomicity(原子性)

           一个事务的所有操作,要么全部成功、要么全部失败

      1.1.2  Consistency(一致性)

           在事务开始之前、事务结束之后,数据库的完整性没有遭到破坏

      1.1.3  Isolation(隔离性)

           数据库允许多个并发事务同时对数据进行读写和修改,隔离性可以防止多个事务执行时由于交叉执行而产生数据的不一致;

           事务的隔离级别:读未提交read uncommitted、读提交read committed、可重复读repeatable read、串行化Serializable;

      1.1.4  Durability(持久性)

            事务处理完成后,对数据的修改是永久性的;

2、事务控制语句

  begin(start transaction):      显示开启事务

  commit(commit work):        事务提交(事务提交后对数据进行的修改称为永久性)

  rollback(rollback work):         事务回滚(撤销之前对数据库的所有操作)

  savepoint 保存点名称:          在事务中创建一个保存点(一个事务中可有多个savepoint)

  release savepoint 保存点名称:      删除一个事务中的保存点(如果事务中不存在保存点,会抛出异常)

  rollback to 保存点名称:        把事务回滚到保存点

  set transaction:            设置事务的隔离级别(Innodb存储引擎支持的隔离级别:读未提交read uncommitted、

                       读提交read committed、可重复读repeatable read、串行化Serializable)

  set autocommit=0          禁止事务自动提交(关闭自动提交后,从下一条指令开始开启新的事务,需要使用commit或rollback结束该事务)

  set autocommit=0          开启事务自动提交

3、案例

  【注意】:

      默认情况下,每条SQL语句都可以视为一个事务,SQL执行完成后,自动执行commit;

      通过begin或者set autocommit=0来禁止事务自动提交;

//每个命令后必须加分号,不然报语法错误
BEGIN;
INSERT INTO `user`(name,age) VALUES('lili',27);
INSERT INTO `user`(name,age) VALUES('lili',28);
ROLLBACK;
BEGIN;
INSERT INTO `user`(name,age) VALUES('lili',27);
INSERT INTO `user`(name,age) VALUES('lili',28);
COMMIT;
SET autocommit=0;
INSERT INTO `user`(name,age) VALUES('lili',27);
INSERT INTO `user`(name,age) VALUES('lili',28);
COMMIT;

4、并发事务  引起的问题

      脏读:

        一个事务读取到了  另一个事务修改但是未进行事务提交的数据,一旦 另一个事务进行回滚,就会造成脏读;

        案例:

          左侧、右侧事务隔离级别设置为'read-uncommitted';

          左侧手动开启事务,对id=1的数据进行更新,但未进行事务提交;

          右侧对id=1的数据查询,会读取到左侧事务未提交的数据;

          造成数据的脏读;

      不可重复读:

        一个事务执行相同的多次查询,但每次的结果都不一样,因为另一个并发事务在查询期间对数据作了修改;

        案例:

          左侧、右侧事务均设置为'read-committed';

          左侧对id=1的数据进行更新, 并事务提交;

          同时,右侧对id=1的数据查询,发现数据已经更新;

          造成数据的不可重复读;

      幻读:

        一个事务执行相同的多次查询,发现每次查询的数量不一致,因为在查询时另一个并发事务对数据作了新增或者删除;

5、并发事务  隔离级别

      

      read uncommitted:

         允许读取尚未提交的数据;

         会造成脏读、不可重复读、幻读;

      read committed:

         允许读取已提交的数据;

         会造成不可重复读、幻读;

      repeatable read:(MySQL默认的隔离级别)

         可重复读;

         案例:

            左侧、右侧隔离级别设置为'repeatable-read';

            左侧手动开启事务,对id=1的数据进行更新,但事务未提交;

            同时,右侧手动开启事务,进行id=1的数据读取;

            解决了脏读的问题;

          接上述;

           左侧事务提交,id=1的数据更新为666;

           右侧对id=1的数据进行查询,结果仍为600;

           解决了不可重复读的问题;

          接上述;

          左侧新增一条数据,并自动进行事务提交;

          右侧进行查询,发现没有读取到新增的数据(从快照中读取的,保证可重复读);

          右侧对新增的数据进行更新,发现成功;

          造成幻读;

      Serializable:

         最高的隔离级别,可防止脏读、不可重复读、幻读的发生;

         性能比较低;

最新文章

  1. Spring之注入的几种方式
  2. HTML学习有感
  3. cookie自动登录的实现
  4. ruby不能识别中文的一个坑
  5. FTP地址格式如下:“ftp://用户名:密码@FTP服务器IP”
  6. 下载Spring的jar包的方法
  7. winform中DataGrid控件的宽度设置
  8. [原] XAF ListView显示隐藏Footer菜单
  9. Log4cpp介绍及使用
  10. Scroller 实现的弹性回弹的LinearLayout
  11. 从零开始学JAVA(06)-WebService_Jersey_Restful
  12. Spark1.0.0 监测方法
  13. WordPress主题制作全过程
  14. C/C++ kubetu
  15. [bzoj1041][HAOI2008]圆上的整点
  16. Java使用BufferedImage修改图片内容
  17. Tomcat相关面试题,看这篇就够了!保证能让面试官颤抖!
  18. css实现布局
  19. 【数据库问题】sql server 获取MD5值结果不一致的问题 substring(sys.fn_sqlvarbasetostr(HashBytes('MD5','111111')),11,32)
  20. php优秀框架codeigniter学习系列——common.php

热门文章

  1. thinkphp目录解析
  2. Spring学习大纲
  3. [学习笔记]信号基本概念(中断和信号)/名称及常用信号/信号处理/signal函数实践
  4. Google androd性能优化经典
  5. Windows下启动redis错误1067:进程意外中止
  6. windows下部署icescrum
  7. bat 操作数据库(附加,分离,删除,还原)
  8. ASP.NET网页动态添加数据行
  9. ASP.NET网页之间传递参数与值
  10. Wet Shark and Bishops(思维)