事务管理、隔离级别,日志管理

事务Transactions:一组原子性的SQL语句,或一个独立工作单元
事务日志:记录事务信息,实现undo,redo等故障恢复功能
ACID特性:
A:atomicity原子性;整个事务中的所有操作要么全部成功执行,要么全部
失败后回滚
C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性
状态
I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务
所见;隔离有多种隔离级别,实现并发
D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中
Transaction生命周期
一、begin是开启事务:
MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
+-----+---------------+-----+--------+
4 rows in set (0.00 sec)
MariaDB [hellodb]> begin;
Query OK, 0 rows affected (0.00 sec)
我自己插入一条记录,自己看看到:
MariaDB [hellodb]> insert teachers (name,age)values(‘abc‘,30);
Query OK, 1 row affected (0.01 sec)

MariaDB [hellodb]> select from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 7 | abc | 30 | NULL |
+-----+---------------+-----+--------+
5 rows in set (0.00 sec)
但是在另一终端上就看不到记录,还是4条:
MariaDB [hellodb]> select
from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
+-----+---------------+-----+--------+
4 rows in set (0.00 sec)
rollback:撤销操作的命令,在begin后,可以撤销:
先修改tid=4的值,再撤销,就会恢复到从前,如下:
MariaDB [hellodb]> update teachers set age=100 where tid=4;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
MariaDB [hellodb]> select from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 7 | abc | 30 | NULL |
+-----+---------------+-----+--------+
MariaDB [hellodb]> rollback;
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> select
from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
+-----+---------------+-----+--------+
4 rows in set (0.00 sec)
二、我们重做begin后并commit提交:
MariaDB [hellodb]> begin;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> insert teachers (name,age)values(‘abc‘,30);
Query OK, 1 row affected (0.00 sec)

MariaDB [hellodb]> update teachers set age=100 where tid=4;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [hellodb]> commit;
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> select from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 8 | abc | 30 | NULL |
+-----+---------------+-----+--------+
5 rows in set (0.00 sec) 可以查看更新的结果。
这时在另一终端上,也能同步查询出结果:
MariaDB [hellodb]> select
from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 8 | abc | 30 | NULL |
+-----+---------------+-----+--------+
5 rows in set (0.00 sec)
这时的另一终端前后两次查询的结果是不同的,这种现象就不可重复读。
但是并不是所有的命令都能撤销,如下:
MariaDB [hellodb]> begin;
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> select * from courses;
+----------+----------------+
| CourseID | Course |
+----------+----------------+
| 1 | Hamo Gong |
| 2 | Kuihua Baodian |
| 3 | Jinshe Jianfa |
| 4 | Taiji Quan |
| 5 | Daiyu Zanghua |
| 6 | Weituo Zhang |
| 7 | Dagou Bangfa |
+----------+----------------+
7 rows in set (0.00 sec)

MariaDB [hellodb]> truncate table courses;
Query OK, 0 rows affected (0.01 sec)

MariaDB [hellodb]> commit;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> rollback;
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> select from courses;
Empty set (0.00 sec)
所以“ truncate ”不能撤销,因为它不记录日志,delete可以撤销。
在“ mysql ”中,delete之类的命令是系统自动提交的,如下:
MariaDB [hellodb]> select
from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 8 | abc | 30 | NULL |
+-----+---------------+-----+--------+
5 rows in set (0.00 sec)
MariaDB [hellodb]> delete from teachers where tid=8;
Query OK, 1 row affected (0.00 sec)
MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
+-----+---------------+-----+--------+
4 rows in set (0.00 sec)
因为默认的set autocommit=1
MariaDB [hellodb]> show variables like ‘autocommit‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.01 sec)
事务支持保存点:savepoint 实现部分撤销;
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier
先存入数据,再savepoint:
MariaDB [hellodb]> insert teschers (name,age) values(‘a‘,20);
ERROR 1146 (42S02): Table ‘hellodb.teschers‘ doesn‘t exist
MariaDB [hellodb]> insert teachers (name,age) values(‘a‘,20);
Query OK, 1 row affected (0.00 sec)

MariaDB [hellodb]> insert teachers (name,age) values(‘b‘,30);
Query OK, 1 row affected (0.00 sec)

MariaDB [hellodb]> savepoint b;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> insert teachers (name,age) values(‘c‘,40);
Query OK, 1 row affected (0.00 sec)

MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 9 | a | 20 | NULL |
| 10 | b | 30 | NULL |
| 11 | c | 40 | NULL |
+-----+---------------+-----+--------+
7 rows in set (0.00 sec)

MariaDB [hellodb]> rollback to b;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 9 | a | 20 | NULL |
| 10 | b | 30 | NULL |
+-----+---------------+-----+--------+
6 rows in set (0.00 sec)
MariaDB [hellodb]> rollback to a;
ERROR 1305 (42000): SAVEPOINT a does not exist
只有一次撤销机会,用过就没了。
事务隔离级别
事务隔离级别:从上至下更加严格
READ UNCOMMITTED 可读取到未提交数据,产生脏读
READ COMMITTED 可读取到提交数据,但未提交数据不可读,产
生不可重复读,即可读取到多个提交数据,导致每次读取数据不一致
REPEATABLE READ 可重复读,多次读取数据都一致,产生幻读,即
读取过程中,即使有其它提交的事务修改数据,仍只能读取到未修改
前的旧数据。此为MySQL默认设置
SERIALIZABILE 可串行化,未提交的读事务阻塞修改事务,或者未
提交的修改事务阻塞读事务。导致并发性能差
MVCC: 多版本并发控制,和事务级别相关
select @@ tx_isolation; 查看隔离级别
MariaDB [hellodb]> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
接着,我们修改配置文件:/etc/my.cnf 加入:transaction-isolation=READ-UNCOMMITTED
现在是可读到未提交数据:
MariaDB [hellodb]> select @@tx_isolation;
+------------------+
| @@tx_isolation |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set (0.00 sec
下面我们去做实验:1、READ UNCOMMITTED 可读取到未提交数据,产生脏读
MariaDB [hellodb]> begin; 开启事务
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> select @@tx_isolation; 可读未提交数据(脏读)
+------------------+
| @@tx_isolation |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set (0.00 sec)

MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
+-----+---------------+-----+--------+
4 rows in set (0.00 sec)

MariaDB [hellodb]> insert teachers (name,age)values(‘mage‘,30);插入
Query OK, 1 row affected (0.00 sec)

MariaDB [hellodb]> select from teachers; 本机显示更新
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 5 | mage | 30 | NULL |
+-----+---------------+-----+--------+
5 rows in set (0.00 sec)
MariaDB [hellodb]> select
from teachers;另一终端也显示更新
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 5 | mage | 30 | NULL |
+-----+---------------+-----+--------+
5 rows in set (0.01 sec)
rollback;撤销
MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 5 | mage | 30 | NULL |
+-----+---------------+-----+--------+
5 rows in set (0.00 sec)

MariaDB [hellodb]> rollback;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> select from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
+-----+---------------+-----+--------+
4 rows in set (0.00 sec)
2、READ COMMITTED 修改配置文件
MariaDB [hellodb]> begin;
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> insert teachers (name,age)values(‘mage‘,50);插入
Query OK, 1 row affected (0.00 sec)
MariaDB [hellodb]> select
from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 5 | mage | 50 | NULL |
+-----+---------------+-----+--------+
5 rows in set (0.00 sec)
MariaDB [hellodb]> commit;提交
Query OK, 0 rows affected (0.01 sec)

MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 5 | mage | 50 | NULL |
+-----+---------------+-----+--------+
5 rows in set (0.00 sec)

MariaDB [hellodb]> insert teachers (name,age)values(‘guo‘,40);再次插入
Query OK, 1 row affected (0.00 sec)

MariaDB [hellodb]> commit;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> select from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 5 | mage | 50 | NULL |
| 6 | guo | 40 | NULL |
+-----+---------------+-----+--------+
6 rows in set (0.00 sec)
在另一台终端上查看:
MariaDB [hellodb]> select
from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 5 | mage | 50 | NULL |
+-----+---------------+-----+--------+
5 rows in set (0.00 sec)

MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 100 | F |
| 5 | mage | 50 | NULL |
| 6 | guo | 40 | NULL |
+-----+---------------+-----+--------+
6 rows in set (0.00 sec) 在一个事务中,两次不一样结果,所以就产生不可重复读。
3、REPEATABLE READ 可重复读 产生幻读,优:在一个事务中数据是一致的,缺:产生幻读,数据不是同步的
4、可串行化 优:数据在修改时,在同一事务中,一个在修改,一个在查询,就会卡住,只有在修改提交后,才能在另一台同一事务中同步查询到更新数据,串行性安全,并行性差,平时都用可重复读。串行性操作会自动加锁。

事务隔离级别:从上至下更加严格
? READ UNCOMMITTED 可读取到未提交数据,产生脏读
? READ COMMITTED 可读取到提交数据,但未提交数据不可读,产生不可重复读,即可读取到多个提交数据,导致每次读取数据不一致
? REPEATABLE READ 可重复读,多次读取数据都一致,产生幻读,即读取过程中,即使有其它提交的事务修改数据,仍只能读取到未修改前的旧数据。此为MySQL默认设置
? SERIALIZABILE 可串行化,未提交的读事务阻塞修改事务,或者未提交的修改事务阻塞读事务。导致并发性能差eg:insert teacher(name,age) values (‘abc‘,20)
?MVCC: 多版本并发控制,和事务级别
事务隔离级别
事务隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
读未提交(read-uncommitted) 是 是 是 否
不可重复读(read-committed) 否 是 是 否
可重复读(repeatable-read) 否 否 是 否
串行化(serializable) 否 否 否 是
死锁:系统会自动识别,会牺牲其中一个事务,

MariaDB [hellodb]> begin;开启事务
?指定事务隔离级别:
?服务器变量tx_isolation指定,默认为REPEATABLE-READ,可在GLOBAL和
SESSION级进行设置
SET tx_isolation=‘‘
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
?服务器选项中指定
vim /etc/my.cnf
[mysqld]
transaction-isolation=SERIALIZABLE

三、事务日志:transaction log
事务型存储引擎自行管理和使用,建议和数据文件分开存放: redo log undo log
[root@centos7 ~]#cd /var/lib/mysql/
[root@centos7 mysql]#ll -b
total 28708
-rw-rw----. 1 mysql mysql 16384 Feb 21 15:09 aria_log.00000001
-rw-rw----. 1 mysql mysql 52 Feb 21 15:09 aria_log_control
drwx------. 2 mysql mysql 20 Feb 19 15:59 db1
drwx------. 2 mysql mysql 159 Feb 21 11:58 hellodb
-rw-r--r--. 1 root root 7786 Dec 1 2017 hellodb_innodb.sql
-rw-rw----. 1 mysql mysql 18874368 Feb 21 15:09 ibdata1
-rw-rw----. 1 mysql mysql 5242880 Feb 21 15:09 ib_logfile0两个5K大小的存
-rw-rw----. 1 mysql mysql 5242880 Feb 19 14:32 ib_logfile1 放日志的文件
drwx------. 2 mysql mysql 4096 Feb 19 14:32 mysql
drwx------. 2 mysql mysql 4096 Feb 19 14:32 performance_schema
drwx------ 2 mysql mysql 20 Feb 21 11:14 test
drwx------. 2 mysql mysql 20 Feb 19 20:07 wordpress
修改配置文件:vim /etc/my.cnf
[mysqld]
innodb_log_files_in_group=3 innodb_log_group_home_dir=/mysql/log
innodb_log_file_size=100M
#transaction-isolation=SERIALIZABLE (串行性操作会自动加锁)
我们创建一个文件夹,存放事务日志: mkdir /mysql/log/ --> chown mysql.mysql /mysql/log/
错误日志相关配置
SHOW GLOBAL VARIABLES LIKE ‘log_error‘
错误文件路径 log_error=/PATH/TO/LOG_ERROR_FILE
是否记录警告信息至错误日志文件log_warnings=1|0 默值为1
查看事务日志:
MariaDB [hellodb]> show variables like ‘%innodb_log%‘;
+---------------------------+---------+
| Variable_name | Value |
+---------------------------+---------+
| innodb_log_block_size | 512 |
| innodb_log_buffer_size | 8388608 |
| innodb_log_file_size | 5242880 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
+---------------------------+---------+
5 rows in set (0.00 sec)

Innodb事务日志相关配置:
show variables like ‘%innodb_log%‘;
innodb_log_file_size 5242880 每个日志文件大小
innodb_log_files_in_group 2 日志组成员个数
innodb_log_group_home_dir ./ 事务文件路径
innodb_flush_log_at_trx_commit 默认为1
查看通用日志:show variable like ‘general%’;
MariaDB [hellodb]> show variables like ‘general%‘;
+------------------+-------------+
| Variable_name | Value |
+------------------+-------------+
| general_log | OFF |
| general_log_file | centos7.log |
+------------------+-------------+
2 rows in set (0.00 sec) set global general_log=on; 改为on状态
查看日志存放在哪里:show variable like ‘log_output%’;
跟踪日志:tail -f centos7.log
日志改名:set global log_output=‘table‘定义“表”,
慢查询日志:
log_slow_rate_limit = 1 多少次查询才记录,mariadb特有
log_slow_verbosity= Query_plan,explain 记录内容
log_slow_queries = OF同slow_query_log 新版已
在/etc/my.cnf 文件中,加入“long_query_tim=0.1” 这是慢查询的阀值
加入“slow_query_log”这是开始慢查询的日志
MariaDB [hellodb]> show variables like ‘long_query_time‘;
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.100000 |
+-----------------+----------+
1 row in set (0.00 sec)
MariaDB [hellodb]> select sleep(1) from teachers; 文件有多少个数据,就会sleep多少秒。
+----------+
| sleep(1) |
+----------+
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
+----------+
6 rows in set (6.00 sec)
select * from testlog where name=‘wang100000‘;这是全表扫描,
innodb_flush_log_at_trx_commit
?说明:设置为1,同时sync_binlog = 1表示最高级别的容错
innodb_use_global_flush_log_at_trx_commit的值确定是否可以使用SET语句
重置此变量
?1默认情况下,日志缓冲区将写入日志文件,并在每次事务后执行刷新到磁盘。
这是完全遵守ACID特性
?0提交时没有任何操作; 而是每秒执行一次日志缓冲区写入和刷新。 这样可以提
供更好的性能,但服务器崩溃可以清除最后一秒的事务
?2每次提交后都会写入日志缓冲区,但每秒都会进行一次刷新。 性能比0略好一
些,但操作系统或停电可能导致最后一秒的交易丢失
?3模拟MariaDB 5.5组提交(每组提交3个同步),此项MariaDB 10.0支持

?格式配置show variables like ‘binlog_format 默认是" STAEMENT " 语句型日志, delect from students; 进制只会记录下这一个命令。
基于行的日志,会记录“update students set age=now(); 这一个日志,
语句型的日志, 20;数值
二进制日志:
记录导致数据改变或潜在导致数据改变的SQL语句,记录已提交的日志,不依赖于存储引擎,记录提交的完整事务日志,有监控器的作用,数据库文件只记录结果不记录过程,它可进行数据还原,靠完全备份才能做到完全还原,它一直在记录变化的数据,要一直开启,减少数据丢失,要把数据库的数据文件和二进制日志分开存放,若单独丢失某一个都可以还原,二进制日志不能独立使用,依赖于备份,所以要时刻备份,用“row”行记录二进制的日志数据,虽然行的记录结果很多,保证不丢数据,因为要监控二进制日志的大小,在mysql中的折中办法是用“mixed”。

原文地址:https://blog.51cto.com/14128387/2353187

时间: 2024-10-13 11:35:54

事务管理、隔离级别,日志管理的相关文章

SQLServer 事务的隔离级别

SQLServer事务的隔离级别 数据库是要被广大客户所共享访问的,那么在数据库操作过程中很可能出现以下几种不确定情况. 更新丢失(Lost update) 两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了.这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来. 脏读(Dirty Reads) 一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交.这是相当危险的,因为很可能所有的操作都被回滚. 不可重复读(Non-repe

mysql事务以及隔离级别

mysql事务以及隔离级别 1. 简介 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行. 事务用来管理 insert,update,delete 语句 2. 事务的基

事务的隔离级别和传播特性

脏读:当一个事务读取另一个事务未提交的内容,之后由于另一个事务出现了异常回滚了事务,结果造成读取的数据不一致 不可重复读:指一个事务多次读取同一数据,而另一个事务多次对数据进行了修改的操作,这样就导致了第一个事务每次读取的数据不一样, 幻读:当事务一对整张表的数据进行操作时对其进行了新增行,而另一个事务对其进行了删除行,而这时事务一本身对其进行了新增行然而发现并没有对其新增行而产生了幻觉 脏读与不可重复读的区别:脏读是对没有提交的数据进行查询,不可重复读是对已经提交的数据进行的查询 不可重复读与

数据库事务【隔离级别】

为了快速同步数据的需要,我分段执行了两次python脚本,即开启了两个进程同步数据,结果服务器不时报出数据库死锁异常,通过排查代码和数据库日志发现,是由长事务并发引起的.代码中有入账和出账两个方法,里面涉及操作较多,都为其加了事务,抛出异常时可自动回滚,采用数据库(mysql)默认的隔离级别(Repeatable read).提到并发,一般就会想到用同步代码块的方法的处理,但是由于项目是分布式的,共用一个主库,单单在代码加锁是不能保证数据的准确的,那就只能在数据库层面去考虑加锁了.由于数据量暂时

【持久层】数据库事务基础——事务的隔离级别

内容导读: 前三节数据库事务.并发带来的风险以及数据库锁都是为了铺垫事务的隔离性. 事务的隔离性不是无缘无故就存在的,他的存在是为了解决某一类问题,带来某一些操作的便捷:解决的问题是指数据库并发操作中数据一致性保证,带来的便捷是指定义好隔离级别之后,数据库会为操作自动加锁(不同的隔离级别拥有不同的自动锁粒度),而不用每次操作都手动的加锁. 写着写着觉得没什么可写的,本文已沦为简单的笔记···· 一.数据库事务 将一组数据库操作看作一个具备特殊数据库语义的执行单元,该执行单元具备ACID的事务属性

事务与隔离级别------《Designing Data-Intensive Applications》读书笔记10

和数据库打交道的程序员绕不开的话题就是:事务,作为一个简化访问数据库的应用程序的编程模型.通过使用事务,应用程序可以忽略某些潜在的错误场景和并发问题,由数据库负责处理它们.而并非每个应用程序都需要事务,有时削弱事务性担保或完全放弃事务,可以获得更高的性能或更高的可用性.怎么样更好的理解数据库中的事务与隔离级别呢?我们借这篇文章来聊一聊吧~ 1.ACID 1983年,Andreas Reuter and Theo H?rder 提出了事务之中重要的四个特性: 原子性(Atomicity): 一般来

实战分析:事务的隔离级别和传播属性

什么是事务? 要么全部都要执行,要么就都不执行. 事务所具有的四种特性 原子性,一致性,隔离性,持久性 原子性 个人理解,就是事务执行不可分割,要么全部完成,要么全部拉倒不干. 一致性 关于一致性这个概念我们来举个例子说明吧,假设张三给李四转了100元,那么需要先从张三那边扣除100,然后李四那边增加100,这个转账的过程对于其他事务而言是无法看到的,这种状态始终都在保持一致,这个过程我们称之为一致性. 隔离性 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据是独立的: 持

数据库事务的隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Serializable,这四个级别可以逐个解决脏读.不可重复读.幻读这几类问题. √: 可能出现    ×: 不会出现   脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 注意:我们讨论隔离级别的场景,主要是在多个

事务的特性及事务的隔离级别(转)

原文:http://www.cnblogs.com/fjdingsd/p/5273008.html 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ⑵ 一致性(Consi

事务的隔离级别及mysql对应操作

/* 本次高并发解决之道 1,更改事务隔离级别为 read uncommitted读未提交 2,查询前设定延迟,延迟时间为随机 50-500 微秒 3,修改数据前将 超范围作为 限定修改条件 事务是作为单个逻辑工作单元执行的一系列操作.可以是一条SQL语句也可以是多条SQL语句.一个支持事务 Transaction的数据库系统,必需要具有这四种特性,以保证保证数据的正确性 事务的隔离级别 隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差:隔离程度越低,数据库的并发性越好. 隔离级别