事务
事务是一组逻辑的操作,要么都执行,要么都不执行
事务4大特性
- 1.原子性
事务是最小的执行单元,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用。
- 2.一致性
执行事务前后,数据保持一致,多个事务对同一数据读取的结果是相同的。
- 3.隔离性
并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。
- 4.持久性
一致事务被提交之后,它对数据库中数据库的改变是持久的,即使数据发生故障月不应该对其有任何影响。
并发事务带来哪些问题
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。
- 脏读(Dirty read)
当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
- 丢失修改(Lost to modify)
指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
- 不可重复读(Unrepeatableread)
指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
- 幻读(Phantom read)
幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
- 不可重复度和幻读区别:
不可重复读的重点是修改,幻读的重点在于新增或者删除。
事务隔离级别
- READ-UNCOMMITTED(读取未提交)
最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读取已提交)
允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- REPEATABLE-READ(可重复读)
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- SERIALIZABLE(可串行化)
最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
mysql登录
登录名root,密码root(注意p和密码之间不能有空格,u和用户名之间可以有)
mysql -u root -proot
常见错误
- Data truncated for column ‘password’ at row 1
原因:password密码长度超过了
- ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)
原因:修改了my.cnf文件,导致服务无法启动
查看编码
show variables like 'character_set_%';
修改数据库编码
mysql> set character_set_database=utf8;
Query OK, 0 rows affected (0.00 sec)
create database test character set utf8;
ALTER TABLE `test`.`line_account`CHANGE COLUMN `upload_head` `uploadhead` VARCHAR(64) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL COMMENT '' ;
查看建表语句
SHOW CREATE TABLE {table_name};
表注释
show full fields from {table_name}; # 查看表注释
alter table {table_name} modify column {column} {type} comment "{doc}"; # 修改表注释
修改密码
set password for 用户名@localhost=password('新密码');
python 安装mysql三方库
pip instaall MySQL-python
- 失败,安装依赖
sudo apt-get install libmysqlclient-dev
mysql取交集
SELECT ebf_td_device_id FROM ebt_tag_device AS a JOIN ebt_device AS b ON a.ebf_td_device_id =b.ebf_device_id where a.ebf_td_tag_id=13
mysql把null替换成0,去除重复列
select distinct(IFNULL(ebf_id, 0)) as a
from ebt_a
mysql备份
mysqldump -h127.0.0.1 -P3306 -uroot -proot test > hhhhh.sql
mysql恢复
- mysql恢复,自己创建数据库test,切换到tests数据库
create database test;
use test;
source /home/hjd/sql/hhhhh.sql
- mysql恢复,自己创建数据库test
mysql -h127.0.0.1 -P3306 -uroot -proot test < hhhhh.sql
python连接mysql,设置编码
conn = MySQLdb.connect(host='localhost', port=3306, user='root', passwd='root', db='test', charset='utf8')
常见报错
- import MySQLdb:报错
export LD_LIBRARY_PATH=/home/hjd/hjd-dev-env/packages/mysql/lib
- /home/hjd/hjd-dev-env/packages/mysql/bin/mysqld_safe –defaults-file=/home/hjd/hjd-dev-env/packages/conf/my.cnf
报错信息
(hjd-dev-env)[root@host-192-168-1-140 mysql]# /home/hjd/hjd-dev-env/packages/mysql/bin/mysqld_safe --defaults-file=/home/hjd/hjd-dev-env/packages/conf/my.cnf
2016-10-12T03:40:02.622446Z mysqld_safe Logging to '/home/hjd/hjd-dev-env/packages/mysql/logs/error.log'.
2016-10-12T03:40:02.668560Z mysqld_safe Starting mysqld daemon with databases from /home/hjd/hjd-dev-env/packages/mysql/data
2016-10-12T03:40:02.997707Z mysqld_safe mysqld from pid file /home/hjd/hjd-dev-env/packages/mysql/tmp/mysql.pid ended
原因:hjd-dev-env所属用户组问题
解决方法:
chown -R hjd:hjd hjd-dev-env