82张图带你了解MySQL的 高级内容(三)

开课吧开课吧锤锤2021-03-03 14:45

    Java编程语言是一种简单、面向对象、分布式、解释型、健壮安全、与系统无关、可移植、高性能、多线程和动态的语言。如今Java已经广泛应用于各个领域的编程开发。

Java

    手动提交

    如果需要手动commit和rollback的话,就需要明确的事务控制语句了。

    典型的MySQL事务操作如下

    starttransaction;

    ...#一条或者多条语句

    commit;

    上面代码中的starttransaction就是事务的开始语句,编写SQL后会调用commit提交事务,然后将事务统一执行,如果SQL语句出现错误会自动调用Rollback进行回滚。

    下面我们就通过示例来演示一下MySQL的事务,同样的,我们需要启动两个窗口来演示,为了便于区分,我们使用mysql01和mysql02来命名。

Java

    我们用starttransaction命令启动一个事务,然后再cxuan005表中插入一条数据,此时mysql02不做任何操作。涉及的SQL语句如下。

    starttransaction;

Java

    然后执行

    select*fromcxuan005;

    查询一下cxuan005中的数据

Java

  嗯。。。很多长度太长了,现在我们把所有的info数据都更新为cxuan。

    updatecxuan005setinfo='cxuan';

Java

    更新完毕后,我们先不提交事务,分别在mysql01和mysql02中进行查询,发现只有mysql01窗口中的查询已经生效,而mysql02中还是更新前的数据

Java

    现在我们在mysql01中commit当前事务,然后在mysql02中查询,发现数据已经被修改了。

    除了commit之外,MySQL中还有commitandchain命令,这个命令会提交当前事务并且重新开启一个新的事务。如下代码所示

    starttransaction;#开启一个新的事务

    insertintocxuan005(id,info)values(555,'cxuan005');#插入一条数据

    commitandchain;#提交当前事务并重新开启一个事务

    上面是一个事务操作,在commitandchain键入后,我们可以再次执行SQL语句

    updatecxuan005setinfo='cxuan'whereid=555;

    commit;

    然后再次查询

    select*fromcxuan005;

Java

    执行后,可以发现,我们仅仅使用了一个starttransaction命令就执行了两次事务操作。

    如果在手动提交的事务中,你发现有一条SQL语句写的不正确或者有其他原因需要回滚,那么此时你就会用到rollback语句,它会回滚当前事务,相当于什么也没发生。如下代码所示。

    starttransaction;

    deletefromcxuan005whereid=555;

    rollback;

    这里切忌一点:delete删除语句一定要加where,不加where语句的删除就是耍流氓。

    在同一个事务操作中,最好使用相同存储引擎的表,如果使用不同存储引擎的表后,rollback语句会对非事务类型的表进行特别处理,因此commit、rollback只能对事务类型的表进行提交和回滚。

    我们提交的事务一般都会被记录到二进制的日志中,但是如果一个事务中包含非事务类型的表,那么回滚操作也会被记录到二进制日志中,以确保非事务类型的表可以被复制到从数据库中。

    这里解释一下什么是事务表和非事务表

    事务表和非事务表

    事务表故名思义就是支持事务的表,支不支持事务和MySQL的存储类型有关,一般情况下,InnoDB存储引擎的表是支持事务的,关于InnoDB的知识,我们会在后面详细介绍。

    非事务表相应的就是不支持事务的表,在MySQL中,存储引擎MyISAM是不支持事务的,非事务表的特点是不支持回滚。

    对于回滚的话,还要讲一点就是SAVEPOINT,它能指定事务回滚的一部分,但是不能指定事务提交的一部分。SAVEPOINT可以指定多个,在满足不同条件的同时,回滚不同的SAVEPOINT。需要注意的是,如果定义了两个相同名称的SAVEPOINT,则后面定义的SAVEPOINT会覆盖之前的定义。如果SAVEPOINT不再需要的话,可以通过RELEASESAVEPOINT来进行删除。删除后的SAVEPOINT不能再执行ROLLBACKTOSAVEPOINT命令。

    我们通过一个示例来进行模拟不同的SAVEPOINT

    首先先启动一个事务,向cxuan005中插入一条数据,然后进行查询,那么是可以查询到这条记录的

    starttransaction;

    insertintocxuan005(id,info)values(666,'cxuan666');

    select*fromcxuan005whereid=666;

    查询之后的记录如下

Java

    然后我们定义一个SAVEPOINT,如下所示

    savepointtest;

    然后继续插入一条记录

    insertintocxuan005(id,info)values(777,'cxuan777');

    此时就可以查询到两条新增记录了,id是666和777的记录。

    select*fromcxuan005whereid=777;

Java

    那么我们可以回滚到刚刚定义的SAVEPOINT

    rollbacktosavepointtest;

    再次查询cxuan005这个表,可以看到,只有id=666的这条记录插入进来了,说明id=777这条记录已经被回滚了。

Java

    此时我们看到的都是mysql01中事务还没有提交前的状态,所以这时候mysql02中执行查询操作是看不到666这条记录的。

    然后我们在mysql01中执行commit操作,那么此时在mysql02中就可以查询到这条记录了。

    以上内容由开课吧老师程序员cxuan提供,更多Java教程尽在开课吧广场Java教程频道。

有用
分享