代码改变世界

9月12日培训日记

2006-09-12 16:43  java ee spring  阅读(114)  评论(0编辑  收藏  举报

一个事务的一致性,举例:银行转帐的过程
两个事务之间的隔离性,举例:你取钱时,有人给汇款(产品购买)!
默认情况下,直接执行的一条语句自己就是一个独立的事务,一个事务不能回滚其他的事务。
并发事务中可能发生的各种问题:脏读、不可重复读、虚(幻)读。
事务隔离级别:Read Uncommitted、Read Committed、Repeatable Read、Serializable
做事务实验时要注意MyISAM与InnoDB的问题,MyISAM就是Access一样的桌面数据库,不支持事务和主外键关联,讲课时用MyISAM犯犯错误,再引出InnoDB有较好的教学效果。
要把一个表从一个类型转到另一个类型,可使用ALTER TABLE语句,这个语句指明新的类型:
ALTER TABLE t ENGINE = MYISAM;
ALTER TABLE t TYPE = BDB;
虽然TYPE仍然在MySQL 5.1中被支持,现在ENGINE是首选的术语。

select @@autocommit;set autocommit=0|1
begin,commit,rollback;
用begin,则不用设置autocommit;设置autocommit,则不用begin;
 
第一个实验(select @@tx_isolation,看show variables知道的,默认隔离级别是repeatable read):
1.先把两个都set autocommit=0,免得每次begin;
2.第一个客户select,第二个update只能等待;第一个客户commit后,第二个随之继续。
3.第一个客户select,第二个insert可以通过;
问题:有时候,第一个客户select,第二个update不等待,即使第二个commit了,第一个看到的还是未更新的数据(包括insert的数据也看不到)。怎么有时候等,有时候不等,这是怎么回事呢?
4.反过来,第一个客户CUD,第二个客户R。
5.学员杨金融说:“可以把repeatable read的读想象成每个客户端分别读取了表的一个镜像,即使一个客户更新了实际的表数据,但其他客户的镜像保持不变,这或许是repeatable read的实现原理吧!”
第二个实验
1.将隔离级别改为Serializable,如果用GLOBAL,即set GLOBAL transaction isolation level Serializable,这是对以后的连接起作用,对已建连接不起作用。
2.两个都select可以同时往下进行。

第三个实验(隔离级别是Read Committed)
第四个实验(隔离级别是Read Uncommitted)

mysql中的DATABASE是一个目录,数据库特性储存在数据库目录中的db.opt文件中,数据库中的表对应一个文件。

问题:怎样显示出表的engine类型?show table status;用?查看show命令的帮助而知道的。
将表中的字段改为自动增长:
alter table student modify column id int primary key auto_increment;
即使这样,id还可以手工填写。
下面几种写法都让id自动完成增长,这与SQL Server不一样:
insert into student(name) values('y');
insert into student values(null,'y');
insert into student values('','y');

mysql 5.x开始支持存储过程与存储函数。函数(给我打杯水来)与过程(你把房子打扫了)的区别,如果要返回两个值,用过程还是函数,如果是一个呢?
存储过程中的begin ...end复合语句不开启一个时务。
分析论坛注册流程,从而引出如何让用户注册后直接进入论坛的存储过程,这个存储过程中的语句要放在一个事务中:
delimiter //
CREATE PROCEDURE itcast_insert_user(OUT id_var int,name_var varchar(20))
begin
start transaction;
insert into student(name) values(name_var);
select max(id) into id_var from student;
commit;
end
delimiter ;