呼和浩特商城网站建设,论坛型网站开发,广告片制作公司哪家好,优设网站1.数据库事务 是指作为单个逻辑工作单元执行的系列操作,要么完全执行,要么完全不执行
2.事务的属性 (1)原子性 Atomicity: 原子性是指事务是一个不可分割的工作单位#xff0c;事务中的操作要么都发生#xff0c;要么都不发生 (2)一致性 Consistency: 事务前后数据的完…1.数据库事务 是指作为单个逻辑工作单元执行的系列操作,要么完全执行,要么完全不执行
2.事务的属性 (1)原子性 Atomicity: 原子性是指事务是一个不可分割的工作单位事务中的操作要么都发生要么都不发生 (2)一致性 Consistency: 事务前后数据的完整性必须保持一致。 (3)隔离性Isolation: 事务的隔离性是指多个用户并发访问数据库时一个用户的事务不能被其它用户的事务所干扰多个并发事务之间数据要相互隔离 (4)持久性Durability: 持久性是指一个事务一旦被提交它对数据库中数据的改变就是永久性的接下来即使数据库发生故障也不应该对其有任何影响
3.不考虑事务隔离性出现的问题 (1)脏读:就是一个事务读取到了另一个事务未提交的数据 (2)不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不—致。 (3)幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员B就在这个时候插入了一条具体分数的记录, 当系统管理员A改结束后发现还有条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
4.事务的四种隔离级别
事务隔离级别 更新丢失 脏读 不可重复读 幻读
---------------------------------------------------------------------------------
读未提交 Read uncommitted 不会出现 会出现 会出现 会出现
---------------------------------------------------------------------------------
读提交 Read committed 不会出现 不会出现 会出现 会出现
---------------------------------------------------------------------------------
可重复读 Repeatable read 不会出现 不会出现 不会出现 会出现
---------------------------------------------------------------------------------
串行化 Serializable 不会出现 不会出现 不会出现 不会出现
---------------------------------------------------------------------------------
(1)读未提交 Read uncommitted 最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果;所有的并发事务问题都会发生,解决了更新丢失 (2)读已提交 Read committed 只有在事务提交后,其更新结果才会被其他事务看见。解决了更新丢失、脏读 (3)重复读 Repeatable read 在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。解决了更新丢失、脏读、不可重复读。 (4)串行化 Serializable 事务串行化执行,隔离级别最髙,牺牲了系统的并发性。可以解决并发事务的所有问题。 注: 大多数数据库的默认隔离级别为: Read Commited读已提交 ,如 Oracle,DB2, Sql server。 少数数据库默认的隔离级别为 Repeatable read(可重复读),如 mysql Innodb存储引擎。 因为考虑到数据安全,请使用 Read Commited(读已提交)。 5.管理事务操作 (1)查询数据库事务隔离级别
show global variables like %tx_isolation%;
(2)设置mysql的隔离级别tx_isolation 参数
set global tx_isolation READ-COMMITTED; --全局级别
set session tx_isolation READ-COMMITTED; --会话级别
(3)永久生效需要设置my.cnf参数文件、tx_isolation可选值:
READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE
(4)INNODB手动执行事务操作命令
start transaction; --开启事务
rollback; --回滚事务
savepoint a; --定义当前位置为保存点
rollback to a; --回滚至保存点 a
commit; --提交事务 6.mysql事务隔离界别演示 (1)READ-UNCOMMITTED 读未提交 窗口A
set session tx_isolation READ-UNCOMMITTED;
create table scott.s1 (id int,name varchar(20));
start transaction;
select * from scott.s1; 窗口B
set session tx_isolation READ-UNCOMMITTED;
start transaction;
select * from scott.s1; 窗口A
insert into scott.s1 values (1,s1); --不提交 窗口B
select * from scott.s1; 窗口A
rollback; 窗口B
select * from scott.s1; (2)READ-COMMITTED 读提交 窗口A
set session tx_isolation READ-COMMITTED;
start transaction;
select * from scott.s1; 窗口B
set session tx_isolation READ-COMMITTED;
start transaction;
select * from scott.s1; 窗口A
insert into scott.s1 values (1,s1); --不提交
select * from scott.s1; 窗口B
select * from scott.s1; 窗口A
commit; 窗口B
select * from scott.s1; (3)REPEATABLE-READ 重复读 窗口A
set session tx_isolation REPEATABLE-READ;
start transaction;
select * from scott.s1; 窗口B
set session tx_isolation REPEATABLE-READ;
start transaction;
select * from scott.s1; 窗口B
insert into scott.s1 values (3,s3); --不提交
select * from scott.s1; 窗口A
select * from scott.s1; 窗口B
commit; 窗口A
select * from scott.s1; 窗口A
commit; 窗口A
select * from scott.s1; (4)SERIALIZABLE 串行化 窗口A
set session tx_isolation SERIALIZABLE;
start transaction;
select * from scott.s1; 窗口B
set session tx_isolation SERIALIZABLE;
start transaction;
select * from scott.s1; 窗口B
insert into scott.s1 values (4,s4); --不提交
select * from scott.s1; 窗口A
select * from scott.s1; 窗口B
commit; 窗口A
select * from scott.s1;
commit;