Transaction
来源:互联网 发布:ubuntu dns 重启生效 编辑:程序博客网 时间:2024/05/16 05:13
transaction
交易,业务,事务;办理,处理;(一笔)交易,(一项)事务;
durability 耐用,持久。(durable)
例如转账操作:update t1 set money=money-3;
update t2 set money = money+3;
1.基本概念
并非任意的对数据库的操作序列都是数据库事务。数据库事务拥有以下四个特性,习惯上被称之为ACID特性。原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束,行级锁在commit之前是不能被别人修改。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中(不可以rollback)。
InnoDB的事务处理,将整个过程分为两个阶段,1.将操作记录到事务日志,2.根据事务日志判断,如果OK,则提交到数据库,否则全部废弃,即回滚。不是事务的单独操作是按照默认方式自动提交的,事务操作时,通过关闭自动提交,来达到整体提交的效果。
注意:***InnoDB执行的是行级锁,在执行事务时所有相关的行是被锁定的,commit之前其他进程无法对相关数据修改。
2.通过修改autocommit实现
如果设置autocommit为OFF,则当前进程进行的操作在手动提交数据库前只有自己可以看到,别的进程是看不到的。也就是说保存在事务日志中还没有提交到数据库。比如终端A中得设置
set autocommit = 0; //设置自动提交off
update t1 set money = money - 3;
在A终端中中可以看到钱减少,select查看
但是在B终端select看得时候是不会减少的。
在A终端手动放弃操作 rollback;即将事务日志数据删除,因为没有提交到数据库,没有任何影响。
在A终端最终手动提交 commit;则数据会被写到数据库中。
3.通过start transaction/begin实现;
通过set autocommit时,将autocommit设置为ON之前,对所有的语句都有影响。而start transaction的动作,相当于在commit时自动将autocommit设置为OFF。
如果是单个语句用start transaction比较好,用set auto commit后,一定要记住将其设置为ON。
commit,rollback是一致的。
begin和start transaction一样,建议用start transaction。
<?php
$con = mysql_connect("localhost:3306", "root", "test");
mysql_select_db("study");
/* set autocommit方法实现 */
mysql_query("set autocommit=0", $con);
mysql_query("update student set money=money-30", $con);
$data = mysql_fetch_array(mysql_query("select * from student", $con));
echo "before rollback: " . $data["money"] . "<br>";
mysql_query("rollback");
$data = mysql_fetch_array(mysql_query("select * from student", $con));
echo "after rollback: " . $data["money"] . "<br>";
mysql_query("commit", $con);
<span style="color:#ff0000;">mysql_query("set autocommit=1", $con); /* autocommit开启 */
/* start transaction方法实现 */
mysql_query("start transaction");
mysql_query("update student set money=money-30");
$data = mysql_fetch_array(mysql_query("select * from student", $con));
echo "before rollback: " . $data["money"] . "<br>";
mysql_query("rollback");
$data = mysql_fetch_array(mysql_query("select * from student", $con));
echo "before rollback: " . $data["money"] . "<br>";
mysql_query("commit"); /* 自动开启autocommit */
/* begin方法实现 */
mysql_query("begin");
mysql_query("update student set money=money-30");
$data = mysql_fetch_array(mysql_query("select * from student", $con));
echo "before rollback: " . $data["money"] . "<br>";
mysql_query("rollback");
$data = mysql_fetch_array(mysql_query("select * from student", $con));
echo "before rollback: " . $data["money"] . "<br>";
mysql_query("commit"); /* 自动开启autocommit */
?>
<完>
- Transaction
- Transaction
- Transaction
- transaction
- Transaction
- Transaction
- Transaction
- Transaction
- @Transaction
- transaction
- Transaction
- 1008 transaction transaction transaction
- HDU6210 transaction transaction transaction
- hdu6201 transaction transaction transaction
- transaction transaction transaction HDU
- hdu6201 transaction transaction transaction
- HDU6201 transaction transaction transaction
- HDU6201-transaction transaction transaction
- 一切成功源于积累——20141115 MT4交易平台心得
- Mybaits的使用方法
- memcached 实验篇
- 网站图标 favicon.ico 快速在线制作工具
- CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14方法分享
- Transaction
- MYSQL 命令行大全
- ios plist 文件读写/plist 标签
- PHP 模拟QQ登录及发送消息实现方法
- 统计元音
- 如何给开源的DUILib支持Accessibility
- Oracle 11g R2 补丁修复的bug list
- 数字签名基础知识
- Struts2常用标签总结(转)