#围绕事务
##创建数据库
CREATE DATABASE IF NOT EXISTS NEW_DATABASE_NAME
DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
注:COLLATE从网上搜到的结果是默认排序规则,可设置多个,本人认为不是特别有用,与CHARSET对应就好。
##创建表
create table test (
`id` int(10) not null auto_increment,
`name` varchar(20),
primary key (`id`)
) ENGINE=InnoDB default charset utf8
注:ENGINE分为两种=InnoDB和MyIsam,效率差不多,后者不支持事务。
##事务
###隔离级别
1.READ UNCOMMITTED,顾名思义,可以读取另一个事务未提交数据。模拟场景,两个窗口分别start transaction,然后其中一个窗口操作修改其中一条数据但不提交,另一个窗口通过查询语句可以查询到这条未提交的数据。这种场景也被称之为脏读(Dirty Read)
2.READ COMMITTED,顾名思义,只能读取另一个事务已经提交的数据,未提交的数据是读不到的。模拟场景,两个窗口分别start transaction,然后其中一个窗口操作修改其中一条数据但不提交,另一个窗口通过查询语句无法查询到这条未提交的数据。这种场景导致不可重复读,因为另一个窗口事务有可能已经被提交,这样会导致两次查询结果不一致。
3.REPEATABLE READ,可重复读,MySQL的默认事务级别,它确保同一个事务的多个实例在并发读取数据时,读取到相同的数据。上述三种级别都会产生“幻读”。
4.SERIALIZABLE,可串行化,它是最高的事务级别,通过强制事务排序,解决事务的相互冲突,从而防止“幻读”的问题。原理是在每个读的数据行上添加共享锁,但这总级别会导致大量的超时或锁竞争。
此图摘自(http://xm-king.iteye.com/blog/770721)
“幻读”是指用户读取某一范围数据时,另一个事务如果新增了一条数据,当用户再次读取这一范围数据时,就会出现“幻影行”
###设置事务级别
SET [SESSION | GLOBAL] TRANSACTION
ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
注:如果默认不注明[SESSION | GLOBAL],则默认为设置会话级,即会话结束,修改内容重置;如果想要修改全局,需显示增加GLOBAL参数,确保推出当前会话也可以保留修改结果。
###查看当前事务级别
select @@[global.]tx_isolation;
注:如果不注明[global.],则默认为会话级事务设置;全局级事务设置大于会话级,即新会话继承全局级事务。
##锁
###乐观锁
乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。
###悲观锁
悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中, 将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了 加锁机制,也无法保证外部系统不会修改数据)。
进阶命令
查看字符集
show variables like 'character%';
修改字符集
比如只修改某一项,则使用命令set variable = 'value’即可,如下:
set character_set_server = 'utf8mb4';
查看最大连接数
show variables like '%max_connection%';
重新设置最大连接数
set global max_connections=1000;
查看所有活跃连接数
show full processlist;
或
select * from information_schema.processlist;
查看连接相关
show status like 'Threads%';
Threads_cached:缓存的连接数,数据库重启后此值为0正常,只有当客户端请求服务器,运行一段时间后才会将连接放置到缓存中
Threads_connected:打开的连接数
Threads_created:创建过的连接数,这个数值越大,证明服务器一直在创建线程
- 如果此数值增长较快,证明服务器一直在重新创建线程,可以在my.cnf文件中直接向上调整size,加上thread_cache_size=64
Threads_running:正在运行的连接数
查看当前连接缓存设置的最大数量
show variables like 'thread_cache_size';
这个数值与Threads_cached相关
查看总共请求连接次数
show status like '%connections';
这个数值代表客户端请求连接服务器的总数,与Threads_connected相关,后者代表当前连接的数量