当前位置:Gxlcms > 数据库问题 > MySQL的事务的处理

MySQL的事务的处理

时间:2021-07-01 10:21:17 帮助过:21人阅读

当我们开启一个事务的时候,我们对sql的操作都发生在内存中,但是没有真正的反馈到数据库磁盘的文件中!

2.回滚 rollback

回滚,就是恢复到事务开启之前的最原始的状态!

注意:回滚操作会自动的关闭一个事务,如果想再次执行事务,需要重新开启事务!

3.提交 commit

 

事务的基本原理

 

普通的执行,之所以是立即执行并生效,因为默认的,MySQL对sql语句的执行是自动提交的!所以,开启一个事务的本质,就是关闭了以前的自动提交的功能,而是由用户手动提交(利用commit语句)!

总结事务的步骤:

1,  开启事务

2,  如果执行成功,就提交commit

3,  如果有任何一条sql语句执行失败,则回滚rollback!

 

事务处理最典型的就是借还钱。下面以张三向李四还1000元为例

首先查看数据库中各自的钱数

技术分享

下面是处理还钱事务的代码:

  1. <?<span style="color: #000000">php
  2. </span><span style="color: #008000">/*</span><span style="color: #008000">*
  3. * MySQL实现事务操作
  4. </span><span style="color: #008000">*/</span>
  5. <span style="color: #0000ff">echo</span> "<meta charset=utf-8>"<span style="color: #000000">;
  6. </span><span style="color: #008000">//</span><span style="color: #008000"> 1 连接数据库</span>
  7. <span style="color: #800080">$link</span> = @<span style="color: #008080">mysql_connect</span>(‘localhost‘,‘root‘,‘‘) or <span style="color: #0000ff">die</span>(‘连接数据库失败‘<span style="color: #000000">);
  8. </span><span style="color: #008080">mysql_select_db</span>(‘test‘,<span style="color: #800080">$link</span><span style="color: #000000">);
  9. </span><span style="color: #008080">mysql_query</span>(‘set names utf8‘<span style="color: #000000">);
  10. </span><span style="color: #008000">//</span><span style="color: #008000"> 2 开启事务</span>
  11. <span style="color: #008080">mysql_query</span>("start transaction"<span style="color: #000000">);
  12. </span><span style="color: #008000">//</span><span style="color: #008000">设置一个变量,用来判断所有sql语句是否成功</span>
  13. <span style="color: #800080">$flag</span> = <span style="color: #0000ff">true</span><span style="color: #000000">;
  14. </span><span style="color: #008000">//</span><span style="color: #008000"> 2.1执行事务中的一组sql语句 <br>
  15. // 李四的money+1000</span>
  16. <span style="color: #800080">$sql</span> = "update pdo set mone=money+1000 where name=‘李四‘"<span style="color: #000000">;
  17. </span><span style="color: #800080">$res</span> = <span style="color: #008080">mysql_query</span>(<span style="color: #800080">$sql</span><span style="color: #000000">);
  18. </span><span style="color: #0000ff">if</span> (!<span style="color: #800080">$res</span><span style="color: #000000">) {
  19. </span><span style="color: #008000">//</span><span style="color: #008000">若sql语句执行失败,把$falg设置为false</span>
  20. <span style="color: #800080">$flag</span> = <span style="color: #0000ff">false</span><span style="color: #000000">;
  21. }
  22. </span><span style="color: #008000">//</span><span style="color: #008000">张三的money-1000</span>
  23. <span style="color: #800080">$sql</span> = "update pdo set money=money-1000 where name=‘张三‘"<span style="color: #000000">;
  24. </span><span style="color: #800080">$res</span> = <span style="color: #008080">mysql_query</span>(<span style="color: #800080">$sql</span><span style="color: #000000">);
  25. </span><span style="color: #0000ff">if</span> (!<span style="color: #800080">$res</span><span style="color: #000000">) {
  26. </span><span style="color: #008000">//</span><span style="color: #008000">若sql语句执行失败,把$falg设置为false</span>
  27. <span style="color: #800080">$flag</span> = <span style="color: #0000ff">false</span><span style="color: #000000">;
  28. }
  29. </span><span style="color: #008000">//</span><span style="color: #008000"> 2.2 判断事务是否执行成功</span>
  30. <span style="color: #0000ff">if</span> (<span style="color: #800080">$flag</span><span style="color: #000000">) {
  31. </span><span style="color: #008000">//</span><span style="color: #008000">所有sql语句执行成功,把sql语句提交</span>
  32. <span style="color: #008080">mysql_query</span>(‘commit‘<span style="color: #000000">);
  33. </span><span style="color: #0000ff">echo</span> "还钱成功!"<span style="color: #000000">;
  34. }</span><span style="color: #0000ff">else</span><span style="color: #000000">{
  35. </span><span style="color: #008000">//</span><span style="color: #008000"> 如其中一条执行失败,则回滚到事务开启之前的状态</span>
  36. <span style="color: #008080">mysql_query</span>(‘rollback‘<span style="color: #000000">);
  37. </span><span style="color: #0000ff">echo</span> "还钱失败!"<span style="color: #000000">;
  38. }</span>

结果:

技术分享

技术分享

下面,我们故意把其中一个字段写错,看看事务是否正常处理,数据库中的钱数是否有变化!

  1. <span style="color: #008000">//</span><span style="color: #008000"> 李四的money+1000</span>
  2. <span style="color: #800080">$sql</span> = "update pdo set mone=money+1000 where name=‘李四‘"; <span style="color: #008000">//</span><span style="color: #008000">把moeny字段错写成mone</span>

结果:

技术分享

技术分享

结果是还钱失败,并且数据库中各自的钱数没有变化,说明当某一条语句未执行成功时,事物不会提交,而会回滚,把数据恢复到开始事务之前的原始状态,这也是使用事务的作用,即只有当事务中所有sql语句全部执行成功,事务才会提交,否则会回滚!

下篇会介绍PDO中事务处理

MySQL的事务的处理

标签:手动   comm   基本   关闭   默认   action   src   roo   mon   

人气教程排行