MySQL中不一样存储引擎支持不一样方式的锁,一般会进行自动管理。sql
MyISAM和Memory存储引擎使用表级锁,而InnoDB存储引擎使用行级锁。session
用于手动锁定当前执行线程的表,简单的语法为:分布式
LOCK TABLES table_name [READ|WRITE]
经过READ 或者 WRITE 来获取读锁和写锁。spa
若是加锁的时候已经被其余线程锁定,则会阻塞到其余线程解锁线程
READ锁定后,当前线程不能够写入,其余线程写入会被阻塞到解锁后执行,查询不受影响。日志
WRITE锁定后,当前线程能够插入查询,其余进行插入查询会被阻塞到解锁后执行。code
解除当前线程的全部锁定,通常会话结束的时候会自动进行解锁。事务
//设置自动提交 SET AUTOCOMMIT = 1 //开始事务 START TRANSACTION //提交事务 COMMIT //回滚事务 ROLLBACK //设置回滚点 SAVEPOINT point_name //回滚到指定回滚点 ROLLBACK TO SAVEPOINT point_name
为了保证事务的一致性,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
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。