八、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。
相关文章推荐
- 一:SQL语句 - 系统的撸一遍MySQL
- 十二、MySQL中常用的SQL优化 - 系统的撸一遍MySQL
- MySQL客户端、服务器端工具、sql_mode、存储引擎修改、事务的提交和回滚、隔离级别
- 十、MySQL的SQL优化之定位SQL的问题 - 系统的撸一遍MySQL
- 在T-SQl中使用变量,事务,系统存储,自定义存储
- 在T-SQl中使用变量,事务,系统存储,自定义存储
- Mysql 的SQL mode魔术
- mysql SET sql_mode='' 笔记
- MySQL 严格模式 sql_mode
- 用SQL实现学籍管理系统相关的表操作(转载来的部分已修改)用mysql5.5做的
- mysql的sql_mode
- Mysql:命令选项、配置选项、(全局、会话)系统变量、状态变量:SQL模式
- mysql dba系统学习(22)数据库事务详解
- PowerDesigner15在win7-64位系统下对MySQL 进行反向工程以及建立物理模型产生SQL语句步骤图文傻瓜式详解
- 编写mysql存储过程时,最好设置SQL_MODE
- Mysql SQL Mode简介
- SQL*Plus 系统变量之42 - SHOW[MODE]
- MySQL的sql mode介绍
- DB2数据库、事务控制语言、系统控制语言、函数、嵌入式SQL(SQLJ)
- mysql的sql_mode 模式修改 my.cnf