您的位置:首页 > 数据库 > MySQL

八、MySQL中的事务、锁和SQL_MODE - 系统的撸一遍MySQL

2016-11-01 19:28 316 查看

MySQL中不同存储引擎支持不同方式的锁,通常会进行自动管理。

MyISAM和Memory存储引擎使用表级锁,而InnoDB存储引擎使用行级锁。

LOCK_TABLES

用于手动锁定当前执行线程的表,简单的语法为:

LOCK TABLES table_name [READ|WRITE]

通过READ 或者 WRITE 来获取读锁和写锁。

如果加锁的时候已经被其他线程锁定,则会阻塞到其他线程解锁

READ锁定后,当前线程不可以写入,其他线程写入会被阻塞到解锁后执行,查询不受影响。

WRITE锁定后,当前线程可以插入查询,其他进行插入查询会被阻塞到解锁后执行。

UNLOCK TABLES

解除当前线程的所有锁定,一般会话结束的时候会自动进行解锁。

事务控制

常用事务命令

//设置自动提交
SET AUTOCOMMIT = 1
//开始事务
START TRANSACTION
//提交事务
COMMIT
//回滚事务
ROLLBACK
//设置回滚点
SAVEPOINT point_name
//回滚到指定回滚点
ROLLBACK TO SAVEPOINT point_name


两阶段提交(2pc)

为了保证事务的一致性,MySQL采用两阶段提交机制。

首先调度方向数据方发送prepare T指令,数据方接受到后确认可以提交后,写日志同时返回ready T到调度方。

调度方收集每一个数据方的响应如果全部OK就发送commit T,各个数据放收到后将数据进行变更。如果响应结果为not commit,则发送给数据方Abort T,这时候所有数据方进行数据回滚。

调度起开始两阶段提交的时候会生成xid用于标示一个唯一的分布式事务。

XA START xid

XA END xid

XA PREPARE xid

XA COMMIT xid

XA ROLLBACK xid


SQL_MODE

MySQL可以通过设置不同的SQL Mode来定义不同的SQL语法规则和数据校验等。

//查看sql mode
select @@sql_mode
//设置sql mode
//本次链接生效
set session sql_mode = 'ANSI'
//新的链接中生效,本次无效
set global sql_mode = 'ANSI'

//设置严格模式
set global sql_mode = 'STRICT_TRANS_TABLES'
//设置严格模式 事务过程中会导致事务回滚
set global sql_mode = 'TRADITIONAL'

设置严格模式后,对于 MOD(x/0),或者超过规定范围的数据类型会出错而不是提示Warnning。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MySQL 事务 SQL_MODE