mysql 数据库事务处理_Mysql事务处理问题 - mysql数据库栏目 - 自学php
今天和同学讨论起数据库事务处理的问题,感觉讨论中明白了一些,有些知识看过了,但是没有实际使用还是不理解。
事务处理就是将一系列操作当做一个原子操作,要么全部执行成功,如果执行失败则保留执行期的状态。通过提交和回滚机制来实现操作,如果全部执行成功通过提交执行commit结果就会记录到数据库中,如果执行失败通过回滚操作rollback将发生错误之前的所有错误消除,回退到原来状态。
事务都应该具备ACID特征。所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持续性)四个词的首字母所写,下面以“银行转帐”为例来分别说明一下它们的含义:
原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。
一致性:在事务处理执行前后,数据库是一致的。也就是说,事务应该正确的转换系统状态。比如:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户,要么两个帐户都不变,没有其他的情况。
隔离性:一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。比如说,银行转帐过程中,在转帐事务没有提交之前,另一个转帐事务只能处于等待状态。
持续性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。比如:银行转帐过程中,转帐后帐户的状态要能被保存下来。
注意Mysql支持的存储引擎中,默认为MyISAM,是不支持事务处理的,一般都有InnoDB,是支持事务型的。
(1)如果对一个表进行操作的时候需要事务支持,需要配置存储引擎为InnoDB等支持事务型的。
create table XX() engine=InnoDB;
(2)默认情况下,mysql是自动提交模式(autocommit=1),此时会在每一条语句执行完毕后将所做修改立即提交,此时的commit相当于没用的,rollback只对前一句语句起作用,其实也没用,一条mysql语句默认也是原子操作,没必要。
如果设置默认事务处理,需要将自动提交模式关闭即将autocommit设置为0.
set autocommit=0; 设置模式为关闭
select @@autocommit; 查看值是否已经改变
注意,如果在客户端设置的话,设置完,之后断掉连接后再重连又恢复默认设置。每个客户端只能设置客户自己的。
(3)如果自动提交模式是打开的,则需使用语句:
start transaction; 开始事务处理
XX1;
XX2;
commit; / rollback;
来开始事务处理;而如果设置为关闭,则无需使用start transaction,连续语句就为事务指导rollback或者commit。
(4)注意创建、改变、删除数据库或者其中的数据定义语言以及锁有关的都不能成为事务的一部分,如下面:
start transaction;
insert into test1 values("8");
create table test2(i int);
insert into test1 values("8");
rollback;
html" name="code">执行一个事务处理,当执行到要创建表时,mysql会自动提交,然后再执行创建语句。如果test1的i为主键,则第三条语句出错,回滚时test1还是插入成功,且创建了表test2.
(5)python中使用数据库,最好采用这种形式,
import MySQLdb
try:
conn = MySQLdb.connect(host="localhost",user="root",passwd="your passwd",db="dbName")
except MySQLdb.Error,e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
else:
pass #conn.close()
try:
cur=conn.cursor()
cur.execute('set autocommit=0') #cur.execute('start transaction')
cur.execute('insert into test1 values("8")')
cur.execute('insert into test1 values("8")')
except MySQLdb.Error,e:
conn.rollback()
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
else:
conn.commit()
cur.close()
conn.close()
(6)并行处理问题
Mysql是一个多用户的系统,有多用户在同一时间访问统一数据表,MySIAM采用的是数据表级的锁定标记,来保证同一时间只有一个用户访问此表;Innodb采用了数据行级的访问机制,即两个用户可以对同一个表中不同行的数据同时进行修改,而如果是同一行,则先来的用户先锁住此行,操作结束释放锁后,下一个用户才能操作。
(7)事务处理的隔离性问题
InnoDB默认的隔离级别是repeatable read,如果某个用户两次执行同一个select语句,其结果是可重复的,如果在事务期间有用户对所要读取的数据进行了操作,那么也不会有显示,比如一个存储引擎为innodb的表,如果有一个客户用事务来select读取表数据,另一个用户此时对表做了一个插入之类的操作,第一个用户再进行同样的select读取时,显示数据是没有变化的。
(8)多语句操作非原子操作
如上面(6)中会出现一个问题,如果是一个事务操作,读取数据后,想对数据进行操作,但是可能有另外一个人对此做了操作,那再对此数据进行操作就不对了。
此时需要明确加锁来锁住表,防止别人更改数据,执行结束后释放锁。
lock tables XX write;
XXXXXX;
unlock tables;
也可以使用相对更新代替绝对更新,相对于当前值进行更新,不根据上次的值算出一个绝对值进行更新。这样避免了多条语句的非原子操作。
set a = a - 3 XXXXXXXXXXX;
mysql 数据库事务处理_Mysql事务处理问题 - mysql数据库栏目 - 自学php相关推荐
- mysql基础搭建_MySql基础-构建MySql数据库:安装MySql-server、MySql-client
1 构建MySQL服务器 1.1 问题 本案例要求熟悉MySQL官方安装包的使用,快速构建一台数据库服务器: 安装MySQL-server.MySQl-client软件包 修改数据库用户root的密码 ...
- mysql网页后台_MySQL(PHP网站后台数据库)
MySQL是一款非常受欢迎的开源SQL数据库管理系统,它由MySQL AB开发.发布和支持,MySQL 的执行性能非常高,运行速度非常快,并非常容易使用.是一个非常捧的数据库,PHP 和MYSQL完美 ...
- mysql workbench 闪电_MySQL Workbench下载|可视化数据库设计建模(MySQL Workbench) 8.0 最新版-闪电下载吧...
MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具.它是著名的数据库设计工具DBDesigner4的继任者.你可以用MySQL Workbench设计和创建新的数据库图示,建 ...
- mysql 系统默认_mysql之系统默认数据库
相关内容: 系统默认数据库information_schema,performance_schema,mysql,test 的意义 首发时间:2018-02-23 17:10 安装mysql完成后, ...
- 命令行mysql数据库备份_MySQL命令行备份数据库
For instance : 数据库地址:127.0.0.1 数据库用户名:root 数据库密码:psd 数据库名称:samego samego_2 samego数据库下的两张表 managers_1 ...
- mysql安装图解_mysql 安装图解 mysql图文安装教程(详细说明)
大家都知道MySQL是一款中.小型关系型数据库管理系统,很具有实用性,对于我们学习很多技术都有帮助,前几天我分别装了SQL Server 2008和Oracle10g数据库,也用了JDBC去连接他们, ...
- mysql limit 菜鸟_MySQL之二---MySQL菜鸟入门“秘籍”
一.MySQL简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不 ...
- php mysql安装图解_mysql安装图解 mysql图文安装教程(详细说明)_MySQL
bitsCN.com 下面的是MySQL安装的图解,用的可执行文件安装的,详细说明了一下! 打开下载的mysql安装文件mysql-5.5.15-win32.zip,双击解压缩,运行"set ...
- mysql 存取字符集_MySQL字符集设置—MySQL数据库乱码问题详解
MySQL(4.1以后版本) 服务器中有六个关键位置使用了字符集的概念,他们是:client .connection.database.results.server .system.MySQL有两个字 ...
最新文章
- bit,byte,汉字,KB,MB,GB,TB...
- getHibernateTemplate()和getSession()的区别
- 大话设计模式(五 体会简单工厂模式的美妙)
- 自然语言处理基础概念
- 每周一起读 × 招募 | ACL 2019:基于知识增强的语言表示模型
- python range 步长为负数_【Python面试】 说说Python中xrange和range的区别?
- 学好前端的 6 点建议,企业需要什么样的Web前端人才?
- jmap查看java进程占用的数据库连接数
- php动态增加div,JavaScript动态创建div等元素实例
- 那些年-SAP固定资产导入AS91 OASV
- java mdb连接_[Java]如何连接一个带密码的mdb文件?
- UNITY单击和双击实现
- julia安装源_Julia 国内镜像安装实测
- 计算机基础表格制作教学设计,word中表格制作教学设计精选
- 微信小程序原生将两张图片合成一张并保存至手机中
- 信用,在中国究竟值多少钱?
- 最新Lua网络验证系统+lua代码/PHP后端开发
- 软件测试的目的和意义
- java算法--冒泡算法
- uva10808 - Rational Resistors
热门文章
- android脚本快捷方式,Android:如何创建主屏幕快捷方式启动shell脚本?
- 初中计算机职称答辩,晋升中学语文高级教师职称答辩内容举例
- python读取sql_从python读取sql的实例方法
- Pycharm 项目无法导入自己写的模块(问题记录贴)
- 实验楼 1. k-近邻算法实现手写数字识别系统--《机器学习实战 》
- TimerTask定时任务
- find之exec和args
- 如何在EXCEL中添加下拉框
- 不同的容器里实现 RadioButton的单选
- linux硬盘检测工具,CrazyDiskInfo 硬盘检测工具 Linux版 | 厘米天空