Mysql事务处理

上传人:pu****.1 文档编号:512146656 上传时间:2023-04-10 格式:DOCX 页数:16 大小:38.94KB
返回 下载 相关 举报
Mysql事务处理_第1页
第1页 / 共16页
Mysql事务处理_第2页
第2页 / 共16页
Mysql事务处理_第3页
第3页 / 共16页
Mysql事务处理_第4页
第4页 / 共16页
Mysql事务处理_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《Mysql事务处理》由会员分享,可在线阅读,更多相关《Mysql事务处理(16页珍藏版)》请在金锄头文库上搜索。

1、Mysql事务处理博客分类: 数据库MySQLOracleSQL设计模式一、事务【定义】事务:是指作为单个逻辑工作单元执行的一系列操作 当前mysql的存储引擎中只有innodb和BDB实现了事务的ACID,并且实现机制和oracle是一致的,主要使用了mvcc的实现理论。 mysql的事务分两种,一种是标准的事务,也叫normal transaction ,还有一个叫statement transaction。其中normal transaction是标准的实现ACID的事务,而statement transaction是就是一个语句是一个事务。平时我们可以设置mysql autocommi

2、t为true,其实这里是只有statement transaction,没有normal transaction,就是把每个statement transaction当作一个normal transaction。MYSQL的事务处理主要有两种方法: 1、用begin,rollback,commit来实现 begin 开始一个事务 rollback 事务回滚 commit 事务确认 2、直接用set来改变mysql的自动提交模式 MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过 set autocommit=0 禁止自动提交 set autocommit=1 开

3、启自动提交 来实现事务的处理。 当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束。 注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务! 常用的是第一种方法!二、定义事务MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务。在复杂的应用场景下这种方式就不能满足需求了。为了打开事务,允许在COMMIT和ROLLBACK之前多条语句被执行,我们需要做以下两步:1, 设置MySQL的autocommit属性为0,默认为12,使用STAR

4、T TRANSACTION语句显式的打开一个事务如果已经打开一个事务,则SET autocommit=0不会起作用,因为START TRANSACTION会隐式的提交session中所有当前的更改,结束已有的事务,并打开一个新的事务。使用SET AUTOCOMMIT语句的存储过程例子:Java代码1. CREATEPROCEDUREtfer_funds 2. (from_accountint,to_accountint,tfer_amountnumeric(10,2) 3. BEGIN 4. SETautocommit=0; 5. 6. UPDATEaccount_balanceSETbala

5、nce=balance-tfer_amountWHEREaccount_id=from_account; 7. 8. UPDATEaccount_balanceSETbalance=balance+tfer_amountWHEREaccount_id=to_account; 9. 10. COMMIT; 11. END;Java代码1. CREATEPROCEDUREtfer_funds 2. (from_accountint,to_accountint,tfer_amountnumeric(10,2) 3. BEGIN 4. SETautocommit=0; 5. 6. UPDATEacco

6、unt_balanceSETbalance=balance-tfer_amountWHEREaccount_id=from_account; 7. 8. UPDATEaccount_balanceSETbalance=balance+tfer_amountWHEREaccount_id=to_account; 9. 10. COMMIT; 11. END;使用START TRANSACITON打开事务的例子:Java代码1. CREATEPROCEDUREtfer_funds 2. (from_accountint,to_accountint,tfer_amountnumeric(10,2)

7、3. BEGIN 4. STARTTRANSACTION; 5. 6. UPDATEaccount_balanceSETbalance=balance-tfer_amountWHEREaccount_id=from_account; 7. 8. UPDATEaccount_balanceSETbalance=balance+tfer_amountWHEREaccount_id=to_account; 9. 10. COMMIT; 11. END;Java代码1. CREATEPROCEDUREtfer_funds 2. (from_accountint,to_accountint,tfer_a

8、mountnumeric(10,2) 3. BEGIN 4. STARTTRANSACTION; 5. 6. UPDATEaccount_balanceSETbalance=balance-tfer_amountWHEREaccount_id=from_account; 7. 8. UPDATEaccount_balanceSETbalance=balance+tfer_amountWHEREaccount_id=to_account; 9. 10. COMMIT; 11. END;通常COMMIT或ROLLBACK语句执行时才完成一个事务,但是有些DDL语句等会隐式触发COMMIT,所以应该

9、在事务中尽可能少用或注意一下:Java代码1. ALTERFUNCTION 2. ALTERPROCEDURE 3. ALTERTABLE 4. BEGIN 5. CREATEDATABASE 6. CREATEFUNCTION 7. CREATEINDEX 8. CREATEPROCEDURE 9. CREATETABLE 10. DROPDATABASE 11. DROPFUNCTION 12. DROPINDEX 13. DROPPROCEDURE 14. DROPTABLE 15. UNLOCKTABLES 16. LOADMASTERDATA 17. LOCKTABLES 18. R

10、ENAMETABLE 19. TRUNCATETABLE 20. SETAUTOCOMMIT=1 21. STARTTRANSACTIONJava代码1. ALTERFUNCTION 2. ALTERPROCEDURE 3. ALTERTABLE 4. BEGIN 5. CREATEDATABASE 6. CREATEFUNCTION 7. CREATEINDEX 8. CREATEPROCEDURE 9. CREATETABLE 10. DROPDATABASE 11. DROPFUNCTION 12. DROPINDEX 13. DROPPROCEDURE 14. DROPTABLE 15

11、. UNLOCKTABLES 16. LOADMASTERDATA 17. LOCKTABLES 18. RENAMETABLE 19. TRUNCATETABLE 20. SETAUTOCOMMIT=1 21. STARTTRANSACTION3,使用Savepoint使用savepoint回滚难免有些性能消耗,一般可以用IF改写savepoint的良好使用的场景之一是“嵌套事务”,你可能希望程序执行一个小的事务,但是不希望回滚外面更大的事务:Java代码1. CREATEPROCEDUREnested_tfer_funds 2. (in_from_acctINTEGER, 3. in_to

12、_acctINTEGER, 4. in_tfer_amountDECIMAL(8,2) 5. BEGIN 6. DECLAREtxn_errorINTEGERDEFAULT0; 7. 8. DECLARECONTINUEHANDLERFORSQLEXCEPTIONBEGIN 9. SETtxn_error=1; 10. END 11. 12. SAVEPINTsavepint_tfer; 13. 14. UPDATEaccount_balance 15. SETbalance=balance-in_tfer_amount 16. WHEREaccount_id=in_from_acct; 17. 18. IFtxn_errorTHEN

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号