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

MySQL中不一样存储引擎支持不一样方式的锁,一般会进行自动管理。sql

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

LOCK_TABLES

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

LOCK TABLES table_name [READ|WRITE]

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

若是加锁的时候已经被其余线程锁定,则会阻塞到其余线程解锁线程

READ锁定后,当前线程不能够写入,其余线程写入会被阻塞到解锁后执行,查询不受影响。日志

WRITE锁定后,当前线程能够插入查询,其余进行插入查询会被阻塞到解锁后执行。code

UNLOCK TABLES

解除当前线程的全部锁定,通常会话结束的时候会自动进行解锁。事务

事务控制

经常使用事务命令

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

两阶段提交(2pc)

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

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

调度方收集每个数据方的响应若是所有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。

相关文章
相关标签/搜索