搜索
首页数据库mysql教程关于Mysql事务性

关于Mysql事务性

Oct 13, 2017 am 10:30 AM
mysql关于

1》事务指的是什么?
          事务可以看做一个业务逻辑处理单元,这个单元要么执行,要么不执行;
2》ACID的原则:
      (1)原子性(Automicity)
      (2)一致性(Consistency)
            A 账户有3000块, B 账户2000快,
             --A --500--》B
             A 账户和B账户总和是5000快
           事物执行之前和执行之后,这个总和这个状态,应该一致的。
       (3)隔离性(Lsolation)
              A账户从3000 里面--》500 -->B账户2500
              update (1)转账的事物
               select sun() A B 之间总和
      (4)持久性(Durability)
              保证持久性:
             1>事务交之前:
                    事务之前将数据写入到磁盘上去了,如果要撤回呢?数据从磁盘上撤回?速度很慢?很痛苦?怎么办?
             2>结合事务志来完成
                   事物日志也是存在磁盘上那么它和数据文件存在磁盘上有什么区别呢?
                 区别:事务志产生的是顺序I/O,而磁盘数据文件是随机I/O 事务日志每一个操作都是次序写到磁盘上一个连续的存储块里面去的,而我们的数据文件并非如此。
                       (1)事物日志:顺序IO
                       (2)数据文件:随机IO
                     将事务写入到事务日志当中,过一会之后事物后台或者相关的进程将事务当中的数据重新落地到数据文件当中,这样我们保证事物所操作的数据的持久性。

3》事务的状态.
      (1)要么就是活动事务
              事务正在执行当中
      (2) 部分提交事务
              我们知道事务要么执行,要么不执行,哪什么叫做部分提交呢?
              就是事务已经执行,一部分已经写入磁盘,另部分正在执行当中,最后一条执行语句正在写的过程当中,我们把它叫做部分提交
      (3)失败的事务
              事务正常提交了,但是并没有达到目的,叫做失败的事务
      (4)中止的事务
              中止的是叫做没有提交,或者走一半就提前结束了,叫做中止。  
      (5)提交的事务
              健康提交完成的事务,我们的事务一定是存在这5种状态中的某一中,事务一旦提交,就无法在撤销。

4》事务的并发和调度
       事务的并发:
            1>提高吞吐量和资源利用率
            2>减少等待时间
                    事务之间提交为了降低彼此之间的影响,我们的需要事务进行隔离,如果隔离呢?这要靠事务调度来完成,任何一个数据库系统本身在事务调度上都有这复杂            调度方法集合很多的策略来完成调度的,一般来讲为了保证事务的隔离性和原子性,他们需要通过事务调度来完成,而调度通常的策略有2种:
         

          事务调度:
              1>可恢复调度
                       一般指,两个事务在彼此之间调度的时候,任何两个事务的交叉执行都不会导致另外一个事务的状态改变,我们把它称作:可恢复调度

              2>无级联调度
                       可恢复调度并步意味着事务的终止结束之后,他们的彼此之间都没有任何影响,尤其是在事务回滚的时候还是会影响,在事务进行回滚的时候还是会                     影响,所以为了避免回滚的时候产生影响还可以实行所谓的叫做:无级联调度。

5》事务的隔离
         我们知道事务调度,事务可能涉及到多个操作,这些操作可以交叉执行,事务调度的存在就是为了更好调度次序使得这些交叉执行彼此之间不会产生过大的影         响,那么为了进可能降低事务之间的影响,于是我们有所谓的隔离级别,  事务的隔离级别有四个。哪四个?
             1>读未提交 read uncommitted
                       在隔离级别,所有事务都可以看到其它未提交的事务的执行结果,本隔离级别很少用于实际应用,因为它的性能也不比其它的级别好多少,读取未提交的数             据,也被成为:脏读(Dirty Read)    
             2>读取提交 read committed
                       大多数的数据库的默认隔离级别(但是Mysql默认级别不是这个),它满足了隔离的简单定义:一个事务只能看到见已经提交事务所做的改变;      
             3>可重读  repeatable read
                      这是Mysql默认事务隔离级别,它确保同一个事务的多个实例在并发读取数据时,会看到同样的数据行,不过理论上,这导致另外一个问题:幻读(Phantom                  read) 简单的说:幻读指当作用户读取某一范围的数据行时,另一个事务在该范围内插入了新一行,当用户再读取该范围的数据行时,会发现新的“幻影行”
         ,Innodb和Falcon引擎通过多版本并发控制(MVCC)机制解决了该问题。     

         4>可串行 serializable
                  这就最高级别的隔离机制,它通过强制事务排序,使其步能相互冲突,从而解决了幻读问题,简单的说:它是在每个读数据行加上了一个共享锁,在这个级别,            可能导致大量的超时现象和锁竞争.

                 一般来讲我们的并发控制想要实现隔离级别,就意味我们要基于并发控制来实现,而我们的并发控制实时
                  技术依赖于一下几种技术:
                    (1).锁.读锁,写锁,独占锁,共享锁.
                    (2).时间戳,必须记录每个事务的启动时间和执行时间
                    (3).多版本和快照隔离

                 额外扩展:
                  事务的饿死状态(锁饥饿):
                   当一个事务申请一种类型的锁,为了实现并发控制,它肯需要这道锁,但是由于事务调度的结果,导致它一直得不到该锁,所产生的结果就是:
              锁饥饿。除此之外还有一种锁叫做:死锁

6》启动事务和回滚

     一般来说启动事务的操作:
            1>启动事务
                   start transcation      
            2>事务回滚
                   rollback            
            3>提交事务
                   commit
  6.1事务回滚实际操作:
           1>启动一个事务
                  start transaction;
           2>删除其中一个student表中的信息
                  delete from student where num='4'
           3>如果进行数据恢复?事务回滚。猜对了。
                  rollback;
           4>查看验证,4是否恢复回来了?
                  select * from student;
                可以;

        6.2 事务提交之后操作,是否可以在回滚?
           1>启动一个事务
                  start transaction;
           2>删除其中一个student表中的信息
                  delete from student where num='4'
           3>事务提交
                  commit;
           4>再尝试回滚
                  rollback  
           5>验证数据是否可以再重新恢复呢?
                 select * from student;
               不可以:

           6.3 事务保存savepoint
            比如:一个事务里面有一个百个操作,100个操作语句,我执行到第80条的时候,才发现第75个出错了执行错了,这个时候是不是要回滚,前80个都撤                   回,这个时候在怎们办呢? 保存点的作用就出来。比如:我每10个操作保存一次:    
          ---->10(做保存点1)------>20(保存点2)

          1>启动一个事务
                start transaction;
          2>删除其中一个student表中的"翠花"的信息
                delete from student where name='cuihua'
                  保存一个事务点
                savepoint yya    
          3>删除其中一个student表中的"西门吹牛"的信息
                delete from student where name='ximenchuiniu'
                savepoint yyb    
          4>删除掉其中一个student表的"牛二"的信息
                delete from student where name='niuer'
                savepoint yyb    
          5>好了开始恢复
                如果想恢复西门吹雪
                rollback to yya  各位思考一下。什么是yya这个保存点呢?      
          6>查看是否恢复成功
                select * from student;

          6.3 事务的自动提交
          1>查询mysql事务自动提交
                 select @@autocommit;
                  mysql> select @@autocommit;
                             +--------------+
                             | @@autocommit |
                             +--------------+
                              |            1 |
                             +--------------+
                             1 row in set (0.00 sec)

          2>修改mysql自动提交
                 set autocommit=0;

          3>测试验证
                 delete from student where name='ximenchuniu'
                 rollback;
               是否恢复回来?而且我们没有明确启动一个事务把?事务支持DML语句回滚.DDL为隐试提交,所以很遗憾不支持。

   验证读未提交:
           查询隔离级别 select @@tx_isolation;
           更改隔离级别 set tx_isolation='read_uncommittd ';
         一个mysql,开两个窗口,双方交叉启动一个事务
   窗口一窗口二共同的操作:
             1.select @@tx_isolation;
             2.set tx_isolation='read_uncommittd ';

       窗口1操作:
            1.start  transaction; 启动一个交叉的事务
              2.update student set age='70'  where d_id='1010';

  窗口2操作
              1.start  transaction; 启动一个交叉的事务
              2.select * from student; 可以看到1窗口变更age为70,1窗口事务未提交,被2看到了,称作脏读      

   验证读提交
           一个mysql,开两个窗口,双方交叉启动一个事务
   窗口1和窗口2共同的操作:
             1.select @@tx_isolation;
             2.set tx_isolation='read_committd ';

            窗口1操作:
             1.start  transaction;启动一个交叉的事务
             2.update student set age='70'  where d_id='1010';
             3.commit; 只有这里提交了,在2窗口第三步骤才会重新看到所提交的数据

           窗口2操作
             1.start  transaction; 启动一个交叉的事务
             2.select * from student;   未看到1窗口所更新数据
             3.select * from student;   当A窗口执行了3步提交后,才能看到更新数 据,避免脏读                                   

   验证可重读
            一个mysql,开两个窗口,双方交叉启动一个事务
   幻影读:
            定义:同一个事务T1,在两个不同的时间段,比如1 2执行同一天查询语句得到记录数量都不同称为幻影读

            窗口1和窗口2共同的操作:
              1.select @@tx_isolation;
              2.set tx_isolation='repeatable-read ';

            窗口1操作
              1.start  transaction;启动一个交叉的事务
              2.update  student set age='60' where num='10';
              3.commit;

            窗口2操作
              1.start  transaction; 启动一个交叉的事务
              2.select * from student;   未看到1窗口所更新数据
              3.select * from student;   1commit;后依旧未看到1窗口所更新数据
              4.commit;    2窗口提交后才可看到1窗口索更新数据

     验证可串行
             一个mysql,开两个窗口,双方交叉启动一个事务
             窗口1和窗口2共同的操作:
               1.select @@tx_isolation;
               2.set tx_isolation='serializable';

             窗口1操作
               1.start  transaction;启动一个交叉的事务
               2.update  student set age='60' where num='10'; 不能执行,只有等2窗口2提交操作之后,才能执行!

             窗口2操作
               1.start  transaction; 启动一个交叉的事务
               2.commit;  这里提交了,1窗口的update 方能执行成功。这个就是可串行!
             原因:
                两个事务在同时交叉执行修改同一个数据,一方必须先提交。否则读写会相互阻塞。

以上是关于Mysql事务性的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
MySQL的位置:数据库和编程MySQL的位置:数据库和编程Apr 13, 2025 am 12:18 AM

MySQL在数据库和编程中的地位非常重要,它是一个开源的关系型数据库管理系统,广泛应用于各种应用场景。1)MySQL提供高效的数据存储、组织和检索功能,支持Web、移动和企业级系统。2)它使用客户端-服务器架构,支持多种存储引擎和索引优化。3)基本用法包括创建表和插入数据,高级用法涉及多表JOIN和复杂查询。4)常见问题如SQL语法错误和性能问题可以通过EXPLAIN命令和慢查询日志调试。5)性能优化方法包括合理使用索引、优化查询和使用缓存,最佳实践包括使用事务和PreparedStatemen

MySQL:从小型企业到大型企业MySQL:从小型企业到大型企业Apr 13, 2025 am 12:17 AM

MySQL适合小型和大型企业。1)小型企业可使用MySQL进行基本数据管理,如存储客户信息。2)大型企业可利用MySQL处理海量数据和复杂业务逻辑,优化查询性能和事务处理。

幻影是什么读取的,InnoDB如何阻止它们(下一个键锁定)?幻影是什么读取的,InnoDB如何阻止它们(下一个键锁定)?Apr 13, 2025 am 12:16 AM

InnoDB通过Next-KeyLocking机制有效防止幻读。1)Next-KeyLocking结合行锁和间隙锁,锁定记录及其间隙,防止新记录插入。2)在实际应用中,通过优化查询和调整隔离级别,可以减少锁竞争,提高并发性能。

mysql:不是编程语言,而是...mysql:不是编程语言,而是...Apr 13, 2025 am 12:03 AM

MySQL不是一门编程语言,但其查询语言SQL具备编程语言的特性:1.SQL支持条件判断、循环和变量操作;2.通过存储过程、触发器和函数,用户可以在数据库中执行复杂逻辑操作。

MySQL:世界上最受欢迎的数据库的简介MySQL:世界上最受欢迎的数据库的简介Apr 12, 2025 am 12:18 AM

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

MySQL的重要性:数据存储和管理MySQL的重要性:数据存储和管理Apr 12, 2025 am 12:18 AM

MySQL是一个开源的关系型数据库管理系统,适用于数据存储、管理、查询和安全。1.它支持多种操作系统,广泛应用于Web应用等领域。2.通过客户端-服务器架构和不同存储引擎,MySQL高效处理数据。3.基本用法包括创建数据库和表,插入、查询和更新数据。4.高级用法涉及复杂查询和存储过程。5.常见错误可通过EXPLAIN语句调试。6.性能优化包括合理使用索引和优化查询语句。

为什么要使用mysql?利益和优势为什么要使用mysql?利益和优势Apr 12, 2025 am 12:17 AM

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

描述InnoDB锁定机制(共享锁,独家锁,意向锁,记录锁,间隙锁,下一键锁)。描述InnoDB锁定机制(共享锁,独家锁,意向锁,记录锁,间隙锁,下一键锁)。Apr 12, 2025 am 12:16 AM

InnoDB的锁机制包括共享锁、排他锁、意向锁、记录锁、间隙锁和下一个键锁。1.共享锁允许事务读取数据而不阻止其他事务读取。2.排他锁阻止其他事务读取和修改数据。3.意向锁优化锁效率。4.记录锁锁定索引记录。5.间隙锁锁定索引记录间隙。6.下一个键锁是记录锁和间隙锁的组合,确保数据一致性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境