Toggle Navigation
首页
Golang
PHP
Laravel
Magento
Linux
数据库
MySQL
Redis
Mongodb
热门知识
程序与生活
架构师之路
静态站点
GitHub
主页
Mysql事务处理
Mysql事务处理
07-30
Mark
1082
事务处理在各种管理系统中都有着广泛的应用,比如人员管理系统,很多同步数据库操作大都需要用到事务处理。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 删除的SQL语句 ``` delete from userinfo where --- delete from mail where --- delete from article where --- ``` 如果没有事务处理,在你删除的过程中,假设出错了,只执行了第一句,那么其后果是难以想象的! 但用事务处理。如果删除出错,你只要rollback就可以取消删除操作(其实是只要你没有commit你就没有确实的执行该删除操作) 一般来说,在商务级的应用中,都必须考虑事务处理的! **MYSQL的事务处理功能** 一直以来我都以为MYSQL不支持事务处理,所以在处理多个数据表的数据时,一直都很麻烦(我是不得不将其写入文本文件,在系统重新加载得时候才写入数据库以防出错)。今天发现MYSQL数据库从4.1就开始支持事务功能,据说5.0将引入存储过程 先简单介绍一下事务吧!事务是DBMS得执行单位。它由有限得数据库操作序列组成得。但不是任意得数据库操作序列都能成为事务。一般来说,事务是必须满足4个条件(ACID) - 原子性(Autmic):事务在执行性,要做到“要么不做,要么全做!”,就是说不允许事务部分得执行。即使因为故障而使事务不能完成,在rollback时也要消除对数据库得影响! - 一致性(Consistency):事务得操作应该使使数据库从一个一致状态转变倒另一个一致得状态!就拿网上购物来说吧,你只有即让商品出库,又让商品进入顾客得购物篮才能构成事务! - 隔离性(Isolation):如果多个事务并发执行,应象各个事务独立执行一样! - 持久性(Durability):一个成功执行得事务对数据库得作用是持久得,即使数据库应故障出错,也应该能够恢复! MYSQL的事务处理主要有两种方法。 1、用begin,rollback,commit来实现 - begin 开始一个事务 - rollback 事务回滚 - commit 事务确认 2、直接用set来改变mysql的自动提交模式 MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过 - set autocommit=0 禁止自动提交 - set autocommit=1 开启自动提交 来实现事务的处理。 但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务! 个人推荐使用第一种方法! **MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!** MYSQL5.0 WINXP下测试通过: ``` mysql> use test; Database changed mysql> CREATE TABLE `dbtest`( -> id int(4) -> ) TYPE=INNODB; Query OK, 0 rows affected, 1 warning (0.05 sec) mysql> select * from dbtest -> ; Empty set (0.01 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into dbtest value(5); Query OK, 1 row affected (0.00 sec) mysql> insert into dbtest value(6); Query OK, 1 row affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> select * from dbtest; +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into dbtest values(7); Query OK, 1 row affected (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from dbtest; +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.00 sec) mysql> ``` ---------- ```php function Tran($sql){ $judge = 1; mysql_query('begin'); foreach($sql as $v){ if(!mysql_query($v)){ $judge = 0; } } if($judge == 0){ mysql_query('rollback'); return false; }elseif($judge == 1){ mysql_query('commit'); return true; } } ``` ---------- ```php $handler = mysql_connect("localhost","root",""); mysql_select_db("task"); mysql_query("SET AUTOCOMMIT=0");//设置为不自动提交,因为MYSQL默认立即执行 mysql_query("BEGIN");//开始事务定义 if(!mysql_query("insert into trans (id) values('2')")) { mysql_query("ROOLBACK");//判断当执行失败时回滚 } if(!mysql_query("insert into trans (id) values('4')")) { mysql_query("ROOLBACK");//判断执行失败回滚 } mysql_query("COMMIT");//执行事务 mysql_close($handler); ```
最新文章
Golang内存问题处理
WebSocket详解
Gopher面试中的Coding(三)
Golang用os/signal包实现平滑重载配置文件
Nginx实现负载均衡的几种方式
Golang中子goroutine与主协程同步的四种实现
Dockerfile文件详解
Golang开发微信公众号
最热文章
Magento实现下载csv数据表格
1887
Laravel带有条件搜索的分页
1808
Magento上传文件、缩略图和导出CSV
1758
Golang开发微信公众号
1728
Magento添加Advanced Dataflow
1715
Magento后台添加rule规则
1639
Magento优化 – MySQL读写分离
1589
Magento常用模块分享
1517
热门标签
下载
laravel分页
上传
导出
微信公众号
Dataflow
rule
规则
读写分离
模块
shell
正则
内存泄漏
Collection
binlog
命名空间
Git
处理
composer
string
package
解锁
锁表
redis sentinel
函数
事务处理
time
架构
系统
读写
golang
事务处理
缓存
日志分析
进阶
schedule
fmt
表分割
Gopher面试
交叉编译
日志分割
事务
分布式锁
HTTPS
Dockerfile
mongodb
channel
git服务器
gogs
php
protobuf
重载配置
版本号
多数据库
负载均衡
concat
mongodb
日志过滤
发展方向
defer
panic
模型关系
goroutine
json
get
post
protobuf
golang算法
代码部署
算法
rpc
docker
elasticsearch
redis
写文件
主从配置
websocket
laravel
package
生成插件
直接下载
数据类型
curl
并发
量级
错误传递
成长
Shell
Go指针
grpc
方法
参数
队列
protobuf
Redis持久化
路上
风景
yum