mysql事务封装

yegucheng 2018-07-19 10:36:07
我想把增删改查的事务提交封装在sql事务中,不想用程序的事务,应该如何封装呢,能否给出范例代码。

下面是我尝试封装的代码
BEGIN
DECLARE t_error INTEGER;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error = 1;
START TRANSACTION;
insert into kehu(kehu_guid)values('e9f045c7-7988-4cbf-9ae0-b9920753e619');
insert into kehu(kehu_guid)values('e9f045c7-7988-4cbf-9ae0-b9920753e618');
IF t_error = 1 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END

提示不正确。
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE t_error INTEGER' at line 2
...全文
343 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yegucheng 2018-08-02
  • 打赏
  • 举报
回复
果然都是大神,看样子事务锁死大致上也能解决。谢谢各位
trainee 2018-07-30
  • 打赏
  • 举报
回复
引用 10 楼 hghua 的回复:
确保事务完整性是数据库的基本功能,是一定能确保的。比如断电、重启,那再次启动数据库时就会自动回滚进行到一半的事务。
有一种情况会造成锁定时间延长,就是程序跟数据库不在一台机器,事务中间网络断开,这时数据库会在检测到对方断开时回滚事务


在事务中间网络断开,数据库服务器是检测不到对方断开的,因为TCP连接本身是虚连接,除非服务器有检测心跳功能,MYSQL没有此功能。
所以若程序事务中间有锁,而执行到一半,出现网络故障,这个锁会一直存在,直到这个进程被手动杀死,或服务器重启。
MYSQL有参数innodb_lock_wait_timeout可设锁的最长时间,超过这个时间自动回滚, 只针对innodb rowlock


hghua 2018-07-27
  • 打赏
  • 举报
回复
引用 9 楼 yegucheng 的回复:
[quote=引用 8 楼 hghua 的回复:]
建议采用程序的事务。
只要正确书写,并不会说中间出现异常导致表锁死,应该会自动回滚的。可在try...catch的finally部分释放事务

不一定,比如中间断电,或网络中断,程序太卡,重启服务器等,意外情况总会出现的。
尤其是程序和服务器不在一个服务器上,出现的概率就更大。[/quote]

确保事务完整性是数据库的基本功能,是一定能确保的。比如断电、重启,那再次启动数据库时就会自动回滚进行到一半的事务。
有一种情况会造成锁定时间延长,就是程序跟数据库不在一台机器,事务中间网络断开,这时数据库会在检测到对方断开时回滚事务
yegucheng 2018-07-27
  • 打赏
  • 举报
回复
引用 8 楼 hghua 的回复:
建议采用程序的事务。
只要正确书写,并不会说中间出现异常导致表锁死,应该会自动回滚的。可在try...catch的finally部分释放事务

不一定,比如中间断电,或网络中断,程序太卡,重启服务器等,意外情况总会出现的。
尤其是程序和服务器不在一个服务器上,出现的概率就更大。
hghua 2018-07-26
  • 打赏
  • 举报
回复
建议采用程序的事务。
只要正确书写,并不会说中间出现异常导致表锁死,应该会自动回滚的。可在try...catch的finally部分释放事务
yegucheng 2018-07-26
  • 打赏
  • 举报
回复
引用 5 楼 xinzhongtianxia 的回复:
为啥不想用程序的事务?

因为程序的事务,如果程序中间出现异常,会导致表锁死,这个不好解决
牛尚小又何妨 2018-07-25
  • 打赏
  • 举报
回复
https://blog.csdn.net/u013882957/article/details/81051722
mysql不能单独执行程序块,关于这点让人很难受。。。。
  • 打赏
  • 举报
回复
为啥不想用程序的事务?
yegucheng 2018-07-19
  • 打赏
  • 举报
回复
如果放入存储过程,这个用参数的方式写sql语句没办法动态,存储过程应该做不了动态的参数。
yegucheng 2018-07-19
  • 打赏
  • 举报
回复
这么惨,我是用参数的方式组装sql语句的,如果放在存储过程里,我得想想参数怎么传入存储过程
zjcxc 2018-07-19
  • 打赏
  • 举报
回复
这个只能放在存储过程中

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧