MYSQL事务之学习笔记

由于项目设计里面,牵扯到了金钱的转移,于是就要用到MYSQL的事务处理,来保证一组处理结果的正确性

用了事务,就不可避免的要牺牲一部分速度,来保证数据的正确性。

只有InnoDB支持事务

事务 ACID Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

1、事务的原子性
一组事务,要么成功;要么撤回。

2、稳定性
有非法数据(外键约束之类),事务撤回。

3、隔离性
事务独立运行。
一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。
事务的100%隔离,需要牺牲速度。

4、可靠性
软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。
可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。
开启事务
 START TRANSACTION 或 BEGIN

提交事务(关闭事务)
 COMMIT

放弃事务(关闭事务)
 ROLLBACK

折返点
 SAVEPOINT adqoo_1
 ROLLBACK TO SAVEPOINT adqoo_1
 发生在折返点 adqoo_1 之前的事务被提交,之后的被忽略

事务的终止

设置“自动提交”模式
 SET AUTOCOMMIT = 0
 每条SQL都是同一个事务的不同命令,之间由 COMMIT 或 ROLLBACK隔开
 掉线后,没有 COMMIT 的事务都被放弃

事务锁定模式

系统默认: 不需要等待某事务结束,可直接查询到结果,但不能再进行修改、删除。
缺点:查询到的结果,可能是已经过期的。
优点:不需要等待某事务结束,可直接查询到结果。

需要用以下模式来设定锁定模式

1、SELECT …… LOCK IN SHARE MODE(共享锁)
查询到的数据,就是数据库在这一时刻的数据(其他已commit事务的结果,已经反应到这里了)
SELECT 必须等待,某个事务结束后才能执行

2、SELECT …… FOR UPDATE(排它锁)
例如 SELECT * FROM tablename WHERE id<200
那么id<200的数据,被查询到的数据,都将不能再进行修改、删除、SELECT …… LOCK IN SHARE MODE操作
一直到此事务结束

共享锁 和 排它锁 的区别:在于是否阻断其他客户发出的 SELECT …… LOCK IN SHARE MODE命令

3、INSERT / UPDATE / DELETE
所有关联数据都会被锁定,加上排它锁

4、防插入锁
例如 SELECT * FROM tablename WHERE id>200
那么id>200的记录无法被插入

5、死锁
自动识别死锁
先进来的进程被执行,后来的进程收到出错消息,并按ROLLBACK方式回滚
innodb_lock_wait_timeout = n 来设置最长等待时间,默认是50秒

 

事务隔离模式

SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL
READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE
1、不带SESSION、GLOBAL的SET命令
 只对下一个事务有效
2、SET SESSION
 为当前会话设置隔离模式
3、SET GLOBAL
 为以后新建的所有MYSQL连接设置隔离模式(当前连接不包括在内)

隔离模式

   READ UNCOMMITTED
 不隔离SELECT
 其他事务未完成的修改(未COMMIT),其结果也考虑在内

   READ COMMITTED
 把其他事务的 COMMIT 修改考虑在内
 同一个事务中,同一 SELECT 可能返回不同结果

   REPEATABLE READ(默认)
 不把其他事务的修改考虑在内,无论其他事务是否用COMMIT命令提交过
 同一个事务中,同一 SELECT 返回同一结果(前提是本事务,不修改)

   SERIALIZABLE
 和REPEATABLE READ类似,给所有的SELECT都加上了 共享锁

出错处理
 根据出错信息,执行相应的处理

最后看看PHP + MySQL事务操作的代码演示:

实际LAMP应用中,一般PHP使用AdoDB操作MySQL,下面给出AdoDB相应的代码方便大家查阅:

-------------------------------------------------------------------------------

 代码如下 复制代码

<?php
// ...

$adodb->startTrans();

//实际,getOne所调用的查询也可以直接放到rowLock来进行,这里只是为了演示效果能更明显些。

$adodb->rowLock('book', 'book_id = 123');

$bookNumber = $adodb->getOne("SELECT book_number FROM book WHERE  book_id = 123");

$adodb->execute("UPDATE book SET book_number = book_number - 1 WHERE  book_id = 123");

$adodb->completeTrans();

// ...
?>

-------------------------------------------------------------------------------

其中,rowLock的方法就是调用的FOR UPDATE来实现的行锁,你可能会想把“FOR UPDATE”直接写到$adodb->getOne()调用的那条SQL语句里面去实现行锁的功能,不错,那样确实可以,但是并不是所有的数据库都使用“FOR UPDATE”语法来实现行锁功能,比如Sybase使用“HOLDLOCK”的语法来实现行锁功能,所以为了你的数据库抽象层保持可移植性,我还是劝你用rowLock来实现行锁功能

时间: 2024-08-02 01:43:24

MYSQL事务之学习笔记的相关文章

Mysql源码学习笔记 偷窥线程_Mysql

感觉代码有些凌乱,注释代码都写的比较随意,好像没有什么统一的规范,不同的文件中代码风格也有差异,可能Mysql经过了很多牛人的手之后,集众牛人之长吧.也可能是我见识比较浅薄,适应了自己的代码风格,井底之蛙了,总之还是怀着敬畏的心情开始咱的源码之旅吧.本人菜鸟,大神轻拍. Mysql可以启动起来了,应该怎么学习呢?总不能从main开始一步一步的看吧,Mysql作为比较底层的大型软件,涉及到数据库实现的方方面面,没有厚实的数据库理论基础和对Mysql各个模块相当的熟悉,从main开始势必会把自己引入

MySQL Group Replication 学习笔记

作者简介 刘伟  云和开创高级顾问 题记:group replication作为mysql官方,在5.7版本阶段开发的,innodb的分布式数据库架构,从发布开始就有很多关注,下文是我对目前为止的材料以及实验的一些总结. 主要资料来源是官方blog:http://mysqlhighavailability.com/ group replication架构 group replication(后文简称GR)实现的分布式数据库架构,底层的分布式基础是Paxos(出于行文限制,此处不单独交代Paxos

mysql常用数据类型学习笔记

数值类型 数值类型大致划分为两大类:一个是整数,一个是浮点数或小数. 整数类型常用的为int类型,允许范围在(-2147483648,2147483648)之间. 浮点数或小数常用类型有:float,double和decimal类型. float类型(单精度浮点数值),double类型(双精度浮点数值),decimal类型(用于要求非常高的精确度计算中,这些类型允许指定数值的精确度和计数方法作为选择参数.精确度在这里是指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的个数) crea

Mysql 存储过程的学习笔记

技术要点 一个存储过程包括名字.参数列表,以及可以包括很多SQL语句的SQL语句集.下面为一个存储过程的定义过程: create procedure proc_name (in parameter integer)begindeclare variable varchar(20);if parameter=1 thenset variable='MySQL';elseset variable='PHP';end if;insert into tb (name) values (variable)

mysql数据库入门学习笔记(1/2)

数据库一直没怎么重视,前段时间看了看mysql的基础知识,不看不知道,一看吓一跳,很多基础都竟然不知道,一直傻傻的用一些简单的.笨笨的方法,看了之后原来竟是如此如此,生活如此多娇,以前看不懂的,现在也懂点了,以前看到就头晕的,现在不晕了,发现一个奇怪的现象,应该很多人都有吧,当学一种知识的时候,而当时确实又是学不会.学不好的时候,随着时间的慢慢推移,再回过头来看的时候,发现比以前容易接受得多了--难怪这么多人到快挂的时候才后悔,不扯这么多了,把记录的笔记分享出来,方便日后查悦. 一.data数据

MYSQL事务处理之学习笔记

mysql事务处理的几个步骤: 1.关闭自动提交 2.开启事务处理 3.有异常就自动抛出异常提示再回滚 4.开启自动提交 注意:mysql只有这个InnoDB驱动是支持事务处理的,默认MyIsAM驱动不支持. 由于项目设计里面,牵扯到了金钱的转移,于是就要用到MYSQL的事务处理,来保证一组处理结果的正确性.用了事务,就不可避免的要牺牲一部分速度,来保证数据的正确性. 只有InnoDB支持事务 事务 ACID Atomicity(原子性).Consistency(稳定性).Isolation(隔

MySQL Group Replication 学习笔记—group replication 小结

group replication 小结 group replication作为mysql官方,在5.7版本阶段开发的,innodb的分布式数据库架构,从发布开始就有很多关注,下文是我对目前为止的材料以及实验的一些总结. 主要资料来源是官方blog:http://mysqlhighavailability.com/ group replication架构 group replication(后文简称GR)实现的分布式数据库架构,底层的分布式基础是Paxos(出于行文限制,此处不单独交代Paxos

mysql 存储过程语法学习笔记

今天又把mysql存储过程学习了下,大家先看以下代码: 对语法不懂的朋友,可以详细看下语法结构.  代码如下 复制代码 CREATE PROCEDURE and CREATE FUNCTION Syntax CREATE     [DEFINER = { user | CURRENT_USER }]     PROCEDURE sp_name ([proc_parameter[,...]])     [characteristic ...] routine_body CREATE     [DE

mysql性能优化学习笔记-存储引擎

mysql体系架构 客户端(java.php.python等) mysql服务层(连接管理器.查询解析器.查询优化器.查询缓存) mysql存储引擎(innodb.myisam等) 存储引擎针对表而言的,不针对库 mysql存储引擎 mysql存储引擎之MyISAM 5.5前默认的存储引擎.临时表(查询.排序时由查询优化器生成的表).系统表 特性: 并发性与锁级别(表级锁), 表损坏修复,检查check table tablename,修复repair table tablename 此外也可以