dwcc2018怎么做网站,wordpress 标签数,drupal wordpress性能,上海注册公司的流程一、MySQL 事务定义 MySQL 事务主要用于处理操作量大#xff0c;复杂度高的数据。比如说#xff0c;在银行管理系统中#xff0c;用户张三向李四账户转账的操作#xff0c;账户转账是一个完整的业务#xff0c;最小的单元#xff0c;不可再分#xff0c;这样#xff0c…一、MySQL 事务定义 MySQL 事务主要用于处理操作量大复杂度高的数据。比如说在银行管理系统中用户张三向李四账户转账的操作账户转账是一个完整的业务最小的单元不可再分这样完成转账操作的这些SQL语句之和就构成一个事务 总的来说
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务处理可以用来维护数据库的完整性保证成批的 SQL 语句要么全部执行要么全部不执行。事务通常用来管理 insert增、update改、delete删 语句。 二、事务满足四个条件
事务是必须满足4个条件原子性、一致性、隔离性、持久性。 1.原子性一个事务transaction中的所有操作要么全部完成要么全部不完成不会结束在中间某个环节。 例如当事务在执行过程中发生错误时已经被修改过的数据会回滚Rollback到事务开始前的状态就像这个事务从来没有执行过一样。 2.持久性当一个事务处理结束后会进行commit提交操作将处理后的数据从内存提交到磁盘中保证数据的持久化存储。 3.一致性在事务开始之前和事务结束以后数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则。 4.隔离性事务通常都是并发的不同事务会同时对数据库中的数据进行读写和修改隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。 事务的隔离分为不同级别包括读未提交Read uncommitted、读提交read committed、可重复读repeatable read和串行化Serializable。 三、MySQL中事务管理的相关SQL指令 START TRANSACTION 显式地开启一个事务 COMMIT 事务提交将事务更新后的数据从内存保存进磁盘中实现数据的持久保存 ROLLBACK 事务回滚结束当前正在进行的事务并将已经修改但未提交的数据回滚到事务开始之前的状态 SAVEPOINT 【标记点】该指令允许在事务中创建一个保存点一个事务中可以有多个 SAVEPOINT RELEASE SAVEPOINT 【标记点】 删除一个事务的保存点当没有指定的保存点时执行该语句会抛出一个异常 ROLLBACK TO 【标记点】把事务回滚到标记点 SET TRANSACTION 用来设置事务的隔离级别。 InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED读未提交、READ COMMITTED读提交、REPEATABLE READ可重复读 和 SERIALIZABLE串行化。
其中我们最常用的两条语句就是commit事务提交和rollback事务回滚。 四、在MySQL中演示简单事务提交与回滚
业务情形id为1的用户张三 给 id为2的用户李四 转账100元
①首先有一张bank的表所有用户的钱初始值都是200元 ②在不开启事物的情况下
1.模拟转张操作SQL代码
#不开启事物的情况下1.执行转张操作所需要的SQL语句
update bank SET money money-100 WHERE id 1;
update bank SET money money100 WHERE id 2;
若未出现异常情况该项转账业务成功执行两个用户的钱发生正确变化 2.模拟中途出现异常SQL代码
#首先自定义一个异常叫money_error
DECLARE money_error CONDITION FOR 1148;2.模拟中途出现异常转张执行失败
update bank SET money money-100 WHERE id 1;
money_error
update bank SET money money100 WHERE id 2;
如图所示若中途出现异常执行失败发现数据只更改了一半张三的钱少了但收款方李四账户并没有多出100元 像上述这种情况在实际项目开发中肯定是不允许出现的因此我们可以借助Mysql数据库中的事务管理将转账这两条SQL语句封装成一条事务使其具有不可分割性原子性
③使用MySql中事务管理来模拟转账操作
当开启事务管理后若执行过程中遇到异常那么被修改但未提交的数据则会回滚到初始值
执行之前两人都是200元 1.模拟开启事务后执行转账操作
#开启事物管理---执行成功则提交到磁盘
start TRANSACTION;
update bank SET money money-100 WHERE id 1;
update bank SET money money100 WHERE id 2;
commit;当事务正常执行并提交commit两人的钱会发生对应的变化 2.模拟转账操作执行过程中出现异常
#定义一个异常叫money_error
DECLARE money_error CONDITION FOR 1148;#开启事物管理---执行失败则会回滚到初始数据
start TRANSACTION;
update bank SET money money-100 WHERE id 1;
money_error
update bank SET money money100 WHERE id 2;
ROLLBACK;
当转账遇到异常时进行事务回滚两人的金额仍然是200元。 通过以上的简单模拟我们已经对事务有了一定了解接下来让我们学习如何在MyBatis中进行事务管理操作。
五、事务管理与MyBatis结合
前提已经构建好MyBatis框架
①.首先我们创建一个用户表用户初始余额都为200元 ②编写转账操作对应SQL语句
!-- 转账事物管理 --!-- 汇款人 --update idoutMoney parameterTypeList update user set money money-#{money} where id #{id}/update!-- 收款人 --update idacceptMoney parameterTypeList update user set money money#{money} where id #{id}/update
③然后编写Dao层接口方法
//事物管理测试//对于mapper的Dao层的接口传入的参数有多个时必须使用param进行标识//汇款public void acceptMoney(Param(money) float money,Param(userId) Integer id);//收款public void outMoney(Param(money)float money,Param(userId)Integer id);
④最后是转账业务的测试代码
无异常情况的情况下
//首先是正常执行转账操作没有异常时
public void transfer(){try{System.out.println(转账前);mapper.findAll();//执行转张mapper.outMoney(100,1);mapper.acceptMoney(100,2);session.commit();//当未捕捉到任何异常时提交事务System.out.println(转账后);mapper.findAll();}catch (Exception e){e.printStackTrace();session.rollback();//一旦捕捉到异常则将事务回滚}finally {if (session ! null) {session.close();//最后释放资源}}} 模拟一个转账异常 Testpublic void transfer(){try{System.out.println(转账前);findAll();//执行转张mapper.outMoney(100,1);int x 1/0; //模拟一个异常mapper.acceptMoney(100,2);session.commit();//当未捕捉到任何异常时提交事务System.out.println(转账后);findAll();}catch (Exception e){e.printStackTrace();session.rollback();//一旦捕捉到异常则将事务回滚}finally {if (session ! null) {//最后释放资源session.close();}}
⑤测试运行结果 正常执行转张操作 若转账中途出现异常 当出现异常转张操作会被中断然后事务回滚我们查看数据库每个人的前仍为初始值200元。 以上就是事务在实际开发过程中的应用本篇文章是我在学习完数据库事务管理后的总结与笔记如果大家喜欢请多多点赞若有错误欢迎指正 拓展多事务之间并发可能会导致的问题
①脏读 ②不可重复读 ③幻读 参考文章
MySQL——事务(Transaction)详解_mysql事务-CSDN博客
MySQL 事务 | 菜鸟教程