美文网首页
事务与存储过程之事务管理

事务与存储过程之事务管理

作者: 三斤耳朵 | 来源:发表于2017-11-15 23:08 被阅读7702次

    事务的概念

    现实生活中,人们经常会进行转账操作,转账可以分为两部分来完成,转入和转出,只有这两个部分都完成才认为转账成功。在数据库中,这个过程是使用两条语句来完成的,如果其中任意一条语句出现异常没有执行,则会导致两个账户的金额不同步,造成错误。

    为了防止上述情况的发生,MySQL中引入了事务,所谓事务就是针对数据库的一项操作,它可以由一条或多条SQL语句组成,同一个事务的操作具备同步的特点,如果其中由一条语句无法执行,那么所有的语句都不会执行,也就是说,食物中的语句要么都执行,要么都不执行。

    在数据库中使用事务是,必须先开启事务,开启事务的语句具体如下

    START TRANSACTION;

    上述语句就用于开启事务,事务开启之后就可以执行SQL语句,SQL语句执行成功后,需要使用相应的语句提交事务,提交事务的语句具体如下:

    COMMIT;

    需要注意的是,在MySQL中直接书写的SQL语句都是自动提交的,而事务中的操作语句都需要使用COMMIT语句手动提交,只有事务后其中的操作才会生效.

    如果不想提交当前事务,还可以使用相关语句取消事务(也称回滚),具体语句如下:

    ROLLBACK;

    需要注意的是,ROLLBACK语句只能针对未提交的事务执行回滚操作,已提交的事务是不能回滚的.

    通过上述的讲解,读者对事务有了一个简单的了解,为了让读者更好的学习事务,接下来通过一个转账的案例来掩饰如何使用事务。在演示之前,首先需要创建一个当天数据库day1116,并在数据库中创建一个account表,插入相应的数据,SQL语句具体如下:

    CREATE TABLE account(

        id INT primary key auto_increment,

        name VARCHAR(40),

        money FLOAT

    );

    INSERT INTO account (name , money) VALUES ('a' , 1000);

    INSERT INTO account (name , money) VALUES ('b' , 1000);

    为了验证数据是否添加成功,可以使用SELECT语句查询account表中的数据,查询结果截图!我们接下来使用事务来演示如何实现转账功能。

    例:首先开启一个事务,然后通过UPDATE语句将a账户的100元钱转给b账户,最后提交事务,具体语句如下:

    START TRANSACTION;

    UPDATE account SET money=money-100 WHERE name='a';

    UPDATE account SET money=money+100 WHERE name='b';

    COMMIT;

    上述语句执行成功以后,可以使用SELECT语句来查询account表中的余额,查询结果截图!

    从查询结果可以看出,通过事务成功的完成了转账功能,需要注意的是,上述两条UPDATE语句中,如果任意一条语句出现错误,就会导致事务不会提交,这样一来,如果再提交事务之前出现异常,事务中未提交的操作就会被取消。因此就可以保证事务的同步性。

    事务有很严格的定义,他必须同时满足4个特性。即原子性,一致性,隔离性,持久性,也就是人们俗称的ACID标准,接下来就针对这4个特性进行讲解,具体如下。

    1、原子性

    原子性是指事务必须被认为是一个不可分割的单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功,事务中如果有任何一个SQL语句执行失败,已经执行成功的SQL语句也必须撤销,数据库的状态退回到执行事务前的状态。

    这在一些关键系统中尤其重要,现实世界的应用程序(如金融系统)执行数据输入或更新,必须保证不出现数据丢失或者数据错误,以保证数据安全性。

    2、一致性

    一致性是指事物将数据库从一种状态转变为下一种一致的状态。例如,在表中有一个字段为姓名,具有唯一约束,即姓名不能重复,如果一个事物对姓名进行了修改,使姓名变得不唯一了,这就破坏了事务的一致性要求,如果事务中的某个动作失败了,系统可以自动撤销事务,返回初始化的状态。

    在MySQL当中,一致性主要由MySQL的日至机制处理,它记录了数据库的所有变化,为事务恢复提供了跟踪记录。如果系统在事务处理中间发生错误,MySQL恢复过程将使用这些日志来发现是否已经完全成功的执行,否则需要返回,因此一致性属性保证了数据库从不返回一个未处理完的事务。

    3、隔离性

    隔离性还可以成为并发控制,可串行化,锁等,当多个用户并发访问数据库时,数据库为每一个用户开起的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

    4、持久性

    事物一旦提交,其所做的修改就会永久保存到数据库中。即使数据库发生故障也不应该对其有任何影响。需要注意的是,事物的持久性不能做到百分之百的持久。只能从事物本身的角度来保证永久性,而一些外部原因导致数据库发生故障,如硬盘损坏,那么所有提交的数据可能都会丢失。

    需要注意的是,针对事物的四个特性有个简单的印象就可以了,不必太过斟酌,事物的操作才是重点掌握的内容。

    事务的提交

    现实生活中许多操作都是需要用户确认的,例如在删除一个文档是当选择删除时,会弹出一个提示对画框。包含两个按钮“确定”和“取消”。如果单击“确定”按钮该文档才会删除。同理,在数据库中,有些命令的使用也是需要被确认的,例如事务中的操作就需要用户确认。当用户确认提交后,事务中的操作才会执行成功,这个过程就是手动提交的过程。接下来针对事物的提交进行详细的讲解。

    为了说明事物的提交方式为手动提交,接下来。在上一节的基础上进行操作。这时的a账户有900元钱b账户有1100元钱,开启一个事务,使用UPDATE语句实现由b账户向a账户转100元钱的转账功能,具体语句如下:

    START TRANSACTION;

    UPDATE account SET money=money+100 WHERE name='a';

    UPDATE account SET money=money-100 WHERE name='b';

    上述语句执行成功后,可以使用SELECT语句来查询account表中的余额,查询结果截图。

    从上述结果可以看出,在事务中实现了转账功能。此时,退出数据库然后重新登录,并查询数据库中各账户的余额信息,查询结果截图。

    从上述结果可以看出事务中的转账操作没有成功,这是因为在事务中转账成功后,还没有提交事务就退出数据库了,由于事务中的语句不能自动提交,因此当前的操作就被自动取消了,接下来再次执行上述语句,然后使用commit的语句来提交。具体语句如下:

    START TRANSACTION;

    UPDATE account SET money=money+100 WHERE name='a';

    UPDATE account SET money=money-100 WHERE name='b';

    COMMIT;

    上述语句执行成功后,退出数据库然后再重新登录,使用SELECT语句查询数据库中各账户的余额,信息查询结果截图。

    从上述结果可以看出事物中的转账操作成功了。需要注意的是,由于事务中的操作都是手动提交的,因此在操作完事务时,一定要使用COMMIT语句提交事务,否则是误操作会失败。

    事务的回滚

    在操作一个事物时,如果发现当前事务中的操作是不合理的,此时只要还没有提交事务就可以通过回滚来取消当前事务,接下来就针对事务的回滚进行详细的讲解。

    这时a账户有1000元,b账户有1000元,开启一个事物,通过update语句将a账户的100元转给b账户,具体语句如下。

    START TRANSACTION;

    UPDATE account SET money = money - 100 WHERE name = 'a';

    UPDATE account SET money = money + 100 WHERE name = 'b';

    上述语句执行成功后,使用SELECT语句查询a账户和b账户的金额查询结果如下:a--900   ,b--1100

    从上述结果可以看出,a账户成功给b账户转账100元前,如果此时a账户想给b账户转账了,由于事务还没有提交,就可以将事务回滚,具体语句如下:

    ROLLBACK;

    ROLLBACK语句执行成功后,再次使用SELECT语句查询数据库,查询结果如下:a--1000   ,b--1000

    从查询结果可以看出,数据库中a账户的金额和b账户的金额还是1000元,并没有完成转账的功能,因此可以说明当前事务中的操作取消了。

    相关文章

      网友评论

          本文标题:事务与存储过程之事务管理

          本文链接:https://www.haomeiwen.com/subject/qwwzmxtx.html