mysql事务隔离级别

oracle和mysql的事务隔离级别还是很不一样的

Oracle 默认使用的事务隔离级别:READ-COMMITTED

在多用户数据库中,对数据并发访问(data concurrency)及数据一致性(data consistency)进行控制是两项极为重要的工作

三种需要阻止的现象是:
1、脏读(dirty read):一个事务读取了被其他事务写入但还未提交的数据。
2、不可重复读(nonrepeatable read):一个事务再次读取其之前曾经读取过的数据时,发现数据已被其他已提交的事务修改或删除。
3、幻读(phantom read):事务按照之前的条件重新查询时,返回的结果集中包含其他已提交事务插入的满足条件的新数据。

四种隔离级别(现在数据库主流是中间两种隔离级别)
READ-UNCOMMITTED: 未提交读 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )
READ-COMMITTED: 提交读 会出现不可重复读、幻读问题(锁定正在读取的行)
REPEATABLE-READ: 可重复读 会出幻读(锁定所读取的所有行)
SERIALIZABLE: 序列化 保证所有的情况不会发生(锁表)

mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ |
+-----------------------+
1 row in set, 1 warning (0.00 sec)

设置事务的隔离级别:
默认的行为(不带session和global)是为下一个(未开始)事务设置隔离级别。如果你使用GLOBAL关键字,语句在全局对从那点开始创建的所有新连接(除了不存在的连接)设置默认事务级别。你需要SUPER权限来做这个。
使用SESSION 关键字为将来在当前连接上执行的事务设置默认事务级别。 任何客户端都能自由改变会话隔离级别(甚至在事务的中间),或者为下一个事务设置隔离级别

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@session.autocommit,@@global.autocommit;
+----------------------+---------------------+
| @@session.autocommit | @@global.autocommit |
+----------------------+---------------------+
| 0 | 1 |
+----------------------+---------------------+
1 row in set (0.00 sec)

mysql> set session transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only,@@SESSION.transaction_isolation, @@SESSION.transaction_read_only;
+--------------------------------+--------------------------------+---------------------------------+---------------------------------+
| @@GLOBAL.transaction_isolation | @@GLOBAL.transaction_read_only | @@SESSION.transaction_isolation | @@SESSION.transaction_read_only |
+--------------------------------+--------------------------------+---------------------------------+---------------------------------+
| REPEATABLE-READ | 0 | READ-UNCOMMITTED | 0 |
+--------------------------------+--------------------------------+---------------------------------+---------------------------------+
1 row in set (0.00 sec)

mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only,@@SESSION.transaction_isolation, @@SESSION.transaction_read_only;
+--------------------------------+--------------------------------+---------------------------------+---------------------------------+
| @@GLOBAL.transaction_isolation | @@GLOBAL.transaction_read_only | @@SESSION.transaction_isolation | @@SESSION.transaction_read_only |
+--------------------------------+--------------------------------+---------------------------------+---------------------------------+
| REPEATABLE-READ | 0 | READ-COMMITTED | 0 |
+--------------------------------+--------------------------------+---------------------------------+---------------------------------+
1 row in set (0.00 sec)

MySQLSyntaxErrorException: Table ‘assetsdb.ASSETS_HARD’ doesn’t exist

应用日志出现表不存在,通过数据库查询表存在,mysql5.7默认是大小写敏感,需要设置参数

14:27:53.165 [http-nio-18100-exec-1] ERROR - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.google.common.util.concurrent.UncheckedExecutionException: org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'assetsdb.ASSETS_HARD' doesn't exist
### The error may exist in com/hpay/it/core/dal/mapper/AssetsHardDOMapper.java (best guess)
### The error may involve com.hpay.it.core.dal.mapper.AssetsHardDOMapper.selectByExample-Inline
### The error occurred while setting parameters
### SQL: SELECT id,assets_type,assets_no,assets_serial,assets_status,assets_place,assets_model,assets_area,assets_sub_area FROM ASSETS_HARD WHERE ( assets_type in ( ? , ? ) and assets_status = ? )
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'assetsdb.ASSETS_HARD' doesn't exist
; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'assetsdb.ASSETS_HARD' doesn't exist] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'assetsdb.ASSETS_HARD' doesn't exist

 

Linux
(1)数据库名与表名是严格区分大小写的;
(2)表的别名是严格区分大小写的;
(3)列名与列的别名在所有的情况下均是忽略大小写的;
(4)变量名也是严格区分大小写的。

Windows
全部不区分大小写

2、lower_case_table_names参数
lower_case_table_names是用来配置数据库名和表名的大小写的。1表示不区分大小写,0表示区分大小写。

需要在my.cnf参数配置文件中添加如上参数后,来生效,从而应用就不会因大小写敏感找不到表的错误

MYSQL5.7.24error:The server quit without updating PID file

快速搭建一套测试环境的mysql数据库服务器,发现没有开启binlog功能,后面添加
log-bin参数至my.cnf文件中,然后重新启动mysql服务,然一直报错很迷惑人的错误
Starting MySQL. ERROR! The server quit without updating PID file (/usr/local/mysql/data/mysql.pid).

但设置其他一些参数没有问题,然后就将矛头指向bin-log这个参数上面,通过查阅文档发现是bug,需要同时制定server-id这个参数才能正常启动数据

通过查阅5.7的官方文档
if you specify the –log-bin option without also specifying a –server-id, the server is not allowed to start. (Bug #11763963, Bug #56739)

mysql5.7.24二进制快速安装

1.下载连接

https://dev.mysql.com/downloads/mysql/5.7.html#downloads

2.解压

tar zxf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz

3.重命名

mv mysql-5.7.24-linux-glibc2.12-x86_64 mysql

4.复制到指定目录

cp -r mysql /usr/local/

5.新建组

groupadd mysql

6.新建用户

useradd -g mysql -d /usr/local/mysql -s /sbin/nologin -MN mysql

7.进入mysql根目录

cd /usr/local/mysql/

8.修改拥有者为mysql用户

chown -R mysql:mysql ./

9.将mysql/support-files下的mysql.server 复制到 /etc/init.d/下并自定义为mysql

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql

10.修改该服务

vi /etc/init.d/mysql

11.修改的内容

basedir=/usr/local/mysql
datadir=/usr/local/mysql/data

12.进入etc目录

cd /etc

13.删除my.cnf

rm -rf my.cnf

14.新建my.cnf

vi my.cnf
[client]
port = 3306
default-character-set=utf8

[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character-set-server=utf8
default_storage_engine = InnoDB
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

15.进入mysql/bin目录下

cd /usr/local/mysql/bin/

16.执行以下命令

./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

17.遇到错误

./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

18.执行以下命令

yum -y install libaio

19.执行初始化

./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

20.遇到错误

./mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory

21.执行以下命令

yum -y install numactl.x86_64

22.执行初始化

./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

23.执行启动命令

service mysql start

24.登录 进入mysql/bin目录下执行

./mysql -uroot -p

25.输入密码

Enter password:输入默认的临时密码

26.修改密码

set password=password('新密码');

27.设置远程访问

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '访问密码';
flush privileges;

28.查看自启服务列表

chkconfig --list

29.添加mysql服务到自启服务

chkconfig --add mysql

30.设置自启

chkconfig mysql on

31.环境变量
为了不用在mysql/bin目录下才能连接mysql 将mysql/bin目录设置到环境变量中

vi ~/.bash_profile
# mysql environment
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
. ~/.bash_profile