mysql transactioncommit的commit到底怎么用

1152人阅读
Mysql(1)
最近使用事务,很多地方有疑惑,搜索到很多文章归纳整理如下
事务ACID特性
atomic 原子性
consistent 一致性
isolated 隔离性
durable 持久性
事务的隔离级别
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL {&
&REPEATABLE READ //可重复读&
&| READ COMMITTED //授权读取&
&| READ UNCOMMITTED //脏读&
&| SERIALIZABLE //串行&
MYSQL的存储引擎
MyISAM (default) : 拥有较高的插入/查询速度, 不支持事务
InnoDB: 事务型数据库首选引擎,行级锁
BDB: 亦支持事务commit rollback
Memory: 内存存储。读取更新效率高,但占用内存;重启mysql时数据消失
Merge: 联合一定数量的MyISAM为一个整体,适用于大规模数据存储
Archive :非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差
Federated: 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
Cluster/NDB :高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用
CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。
BlackHole :黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继
事务操作语句
START TRANSACTION; //开始事务, 或者使用BEGIN 开始事务
COMMIT; //提交事务
ROLLBACK; //回滚事务
隐式提交事务
ALTER FUNCTION, ALTER PROCEDURE, ALTER TABLE,&
CREATE DATABASE, CREATE FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATE TABLE,&
DROP DATABASE, DROP FUNCTION, DROP INDEX, DROP PROCEDURE, DROP TABLE,&
LOAD MASTER DATA,&
LOCK TABLES,&
RENAME TABLE,&
SET AUTOCOMMIT=1,&
START TRANSACTION,&
TRUNCATE TABLE, UNLOCK TABLES.
&当前所有的表均被锁定时,UNLOCK TABLES可以提交事务。
InnoDB中的CREATE TABLE语句被作为一个单一事务进行处理。这意味着,来自用户的ROLLBACK不会撤销用户在事务处理过程中创建的CREATE TABLE语句
问题1. set autocommit = 0 与START TRANSACTION / BEGIN 开启事务是否有区别?
set autocommit = 0 是关闭线程的自动提交模式。MYSQL默认是自动提交每个请求的。
来自 autocommit引起的业务hang住 的总结:
1) 显式的启动事务的方法是begin或 提交事务的方法是
2) set autocommit=0的好处是在频繁开启事务的场景下,减少一次begin的交互
3) 注意set autocommit=0修改了线程变量,会影响本线程存活期间的事务行为
4) set autocommit=1可以提交事务并改变值。
问题2. 事务嵌套
mysql支持事务嵌套吗?
正解:不支持,因为start transaction 会隐式提交上一个事务。
有解决方案吗? 似乎savepoint 是一个办法:参考文章:&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
(1)(1)(4)(2)(1)(1)(1)(7)(1)(1)默认情况下,MySQL 采用 autocommit
模式运行。这意味着,当执行一个用于更新(修改)表的语句之后,MySQL立刻把更新存储到磁盘中,同时记录锁也会被释放。因此如果事务要执行多条更新
(修改)语句,那么从第2条更新语句开始就是在无锁条件下执行了,这样会导致事务失效,破坏数据一致性。
避免此问题的方法就是关闭 autocommit,然后通过执行 commit 语句来提交事务。&
$dbm-&begin();$dbm-&query("SET&autocommit=0");......$dbm-&commit();$dbm-&query("SET&autocommit=1");
注意:不能将"关闭autocommit"作为缺省设置,否则在 innodb 表上执行的查询操作也将因为没有执行 commit 或者 rollback 而一直锁表!因此只能在需要时局部关闭 autocommit,并在操作完成后开启 autocommit!相关资料:|||||||MySQL Innodb事务自动提交(autocommit)来源网络,如有侵权请告知,即处理!编程Tags:                &                    博客访问: 457665
博文数量: 232
博客积分: 6000
博客等级: 准将
技术积分: 2325
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
mysql_query("BEGIN");//开始一个事务mysql_query("SET AUTOCOMMIT=0"); //设置事务不自动commit&$insert="INSERT INTO userinfo VALUES ('aa12','aa','1','aaa')";mysql_query($insert);mysql_query("COMMIT");//非autocommit模式,必须手动执行COMMIT使操作生效//mysql_query("SET AUTOCOMMIT=0");&$insert="INSERT INTO userinfo VALUES ('aa20','aa','1','aaa')";$insert="INSERT INTO userinfo VALUES ('aa8','aa','1')";//mysql_query("COMMIT");if(mysql_num_rows==0)mysql_query("ROLLBACK");//非autocommit模式,执行ROLLBACK使事务操作无效else echo "ok";//mysql_query("CLOSE");mysql_query("SET AUTOCOMMIT=1");//恢复autocommit模式$insert="INSERT INTO userinfo VALUES ('aa15','aa','1','aaa')";mysql_query($insert);//不需要手动执行COMMIT就可以使事务操作生效执行BEGIN之后,其作用同set autocommit=0,而且之后设置set autocommit=0或1时无效。所以,为使操作清楚,一般不使用BEGIN。
阅读(6738) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。QT关于MYSQL事务commit和rollback的问题_qt吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:31,874贴子:
QT关于MYSQL事务commit和rollback的问题收藏
问个关于QT MYSQL事务回滚的问题。我想执行几个SQL,有insert ,create table,当其中有一个失败的时候,比如create table发现已经有这个表了,那么前面的所有操作都回滚,查了很多很多资料,大概知道怎么写 ,可写出来就是没效果,确认过当前数据库是支持 事务的,transaction返回也是true上代码。
AutoTDS-V1型全自动热解吸仪是一款20位常温二次全自动热解吸仪,气路采....
估计这个问题 这个贴吧不会有人会的
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或}

我要回帖

更多关于 commit transaction 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信