首页 数据库 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

热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 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

MySQL:初学者的数据管理易用性 MySQL:初学者的数据管理易用性 Apr 09, 2025 am 12:07 AM

MySQL适合初学者使用,因为它安装简单、功能强大且易于管理数据。1.安装和配置简单,适用于多种操作系统。2.支持基本操作如创建数据库和表、插入、查询、更新和删除数据。3.提供高级功能如JOIN操作和子查询。4.可以通过索引、查询优化和分表分区来提升性能。5.支持备份、恢复和安全措施,确保数据的安全和一致性。

忘记数据库密码,能在Navicat中找回吗? 忘记数据库密码,能在Navicat中找回吗? Apr 08, 2025 pm 09:51 PM

Navicat本身不存储数据库密码,只能找回加密后的密码。解决办法:1. 检查密码管理器;2. 检查Navicat的“记住密码”功能;3. 重置数据库密码;4. 联系数据库管理员。

navicat premium怎么创建 navicat premium怎么创建 Apr 09, 2025 am 07:09 AM

使用 Navicat Premium 创建数据库:连接到数据库服务器并输入连接参数。右键单击服务器并选择“创建数据库”。输入新数据库的名称和指定字符集和排序规则。连接到新数据库并在“对象浏览器”中创建表。右键单击表并选择“插入数据”来插入数据。

mysql:简单的概念,用于轻松学习 mysql:简单的概念,用于轻松学习 Apr 10, 2025 am 09:29 AM

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

Navicat for MariaDB如何查看数据库密码? Navicat for MariaDB如何查看数据库密码? Apr 08, 2025 pm 09:18 PM

Navicat for MariaDB 无法直接查看数据库密码,因为密码以加密形式存储。为确保数据库安全,有三个方法可重置密码:通过 Navicat 重置密码,设置复杂密码。查看配置文件(不推荐,风险高)。使用系统命令行工具(不推荐,需要对命令行工具精通)。

MySQL和SQL:开发人员的基本技能 MySQL和SQL:开发人员的基本技能 Apr 10, 2025 am 09:30 AM

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。

navicat怎么新建连接mysql navicat怎么新建连接mysql Apr 09, 2025 am 07:21 AM

可在 Navicat 中通过以下步骤新建 MySQL 连接:打开应用程序并选择“新建连接”(Ctrl N)。选择“MySQL”作为连接类型。输入主机名/IP 地址、端口、用户名和密码。(可选)配置高级选项。保存连接并输入连接名称。

navicat如何执行sql navicat如何执行sql Apr 08, 2025 pm 11:42 PM

在 Navicat 中执行 SQL 的步骤:连接到数据库。创建 SQL 编辑器窗口。编写 SQL 查询或脚本。单击“运行”按钮执行查询或脚本。查看结果(如果执行查询的话)。

See all articles