什么是事务?
事务:事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部完成,要么全部不完成
事务的特点:
1、原子性:指事务是一个不可再分的工作单位,要么全部完成,要么全部不完成
2、一致性:事务必须使数据库从一个一致性状态,到另一个一致性状态。如:转账前后总金额保持不变。
3、隔离性:事务的隔离性是指,多个用户并发访问数据库时,数据库为每一个用户开启的事务之间互不影响,也就是说,多个事务之间是相互隔离的。
4、持久性:事务一旦提交,它对数据库的数据的改变是永久的,接下来发生任何数据库的异常、事故、故障,都不会对这个改变造成影响。
对于事务的隔离性,可能会发生以下问题:
1、脏读:指一个事物读取了另一个事务未提交的数据。
2、不可重复读:在一个事务中读取了表中的某一行数据,多次读取结果不一致,也就是说一个事务读取了另一个事务更新的数据。Update
在Oracle数据库中,默认就可以避免脏读,但是可能发生不可重复读。
3、虚读(幻读):指一个事务中读取到了别的事务插入的数据,导致前后读取不一致。Insert
MySQL中,此现象又被称为“幽灵行”。
MySQL中默认就可以避免脏读、不可重复读,但是可能发生虚读(幻读)。
//测试类 public class Test { //脏读:值为1,TRANSACTION_READ_UNCOMMITTED //不可重复读:值为2,TRANSACTION_READ_COMMITTED //虚读(幻读):值为4,TRANSACTION_REPEATABLE_READ //完整的隔离性:值为8,TRANSACTION_SERIALIZABLE public static void main(String[] args) { // TODO Auto-generated method stub Connection conn=null; PreparedStatement ps=null; conn=C3P0Utils.getConnection(); try { //设置提交方式为非自动提交 //一点autocommit为false //你必须调用conn.commit()方法才会提交 conn.setAutoCommit(false); //你可以设置事务的隔离级别 //conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); String sql="insert into user(id,username,password) values(?,?,?);"; ps=conn.prepareStatement(sql); ps.setInt(1, 4); ps.setString(2, "zhengqi"); ps.setString(3, "888888"); ps.executeUpdate(); int n=5/0; ps=conn.prepareStatement(sql); ps.setInt(1, 6); ps.setString(2, "zhengqi1"); ps.setString(3, "8888881"); ps.executeUpdate(); conn.commit(); } catch (Exception e) { // TODO Auto-generated catch block //e.printStackTrace(); try { conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }
//c3p0连接池封装类 public class C3P0Utils { //连接池对象 private static DataSource dataSource=new ComboPooledDataSource(); //不用写静态代码块初始化了。 public static Connection getConnection() { try { return dataSource.getConnection(); } catch (SQLException e) { // TODO Auto-generated catch block //e.printStackTrace(); throw new RuntimeException("服务器繁忙。。。"); } } //封装一个可以访问内部连接池的方法 //为了之后dbutils的使用 public static DataSource getDataSource() { return dataSource; } public static void closeAll(Statement ps,Connection conn) { if(ps!=null) { try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void closeAll(ResultSet rs,Statement ps,Connection conn) { if(rs!=null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } closeAll(ps, conn); } }
//测试虚读 public class TestDBUtils { public static void main(String[] args) { // TODO Auto-generated method stub //选择空参构造,构造QueryRunner QueryRunner qr=new QueryRunner(); //从池中获取一个连接 Connection conn=C3P0Utils.getConnection(); try { conn.setAutoCommit(false); String sql="insert into user(id,username,password) values(?,?,?);"; qr.update(conn, sql, 12,"zhaoliu","999999"); int n=5/0; qr.update(conn, sql, 13,"zhaoliu1","9999991"); conn.commit(); } catch (Exception e) { // TODO Auto-generated catch block try { conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { conn.close(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }
事务的隔离级别相关的sql语句:
Set session transaction isolation level{read uncommitted | read committed | repeatable read | serializable}
Read uncommitted:没有提交都能读到 脏读
Read committed:必须提交才能读到,update,不可重复读。
Repeatable read:必须提交才能读到,insert,虚读、幻读。
Serializable:完整的隔离级别。
开启事务:begin
回滚事务:rollback
提交事务:commit
Tomcat目录结构:
Backup:当服务器发生问题时,用backup中的配置文件还原
Bin:可执行目录,xxx.exe,也就是tomcat软件的运行文件
Conf:配置文件,就是tomcat的运行时的配置参数。比如说:manager-gui的用户名密码,还有服务器运行时使用的端口号等信息。
Lib:tomcat运行时需要的类库,就是各种jar包。
Logs:日志文件,tomcat运行时,会产生日志文件,里面有各种运行时的信息、警告、报错。
Temp:运行时产生的临时文件,这个文件夹会很大,且很多无用,导致tomcat越来越慢、卡,我们可以删除它
Webapps:存放我们上传到服务器的网站,这个文件夹也会越来越大。我们也考虑删除某些应用,但是有tomcat默认工程不可以删。
Work:tomcat的工作目录,比如说jsp最终要转化为java执行,这个java报错往往说java多少行有问题,然后,你自己写的是jsp,这时,就需要进到这个目录找到java对应的jsp,改错误。
HTTP协议报文格式:
一共分为两种:HTTP请求报文和HTTP响应报文
请求报文:
1、请求消息行
Get /day01/index.html HTTP/1.1
请求方式 uri 协议/版本号
Get:信息明文传输,不安全,数据量有限制,但是传递参数方便。
Post:报文内容不再明文传输,相对安全,数据量没有限制,传递参数需要在头信息里面拼接。
Uri:统一资源标识符。Uri标识一个服务器上的唯一的一个资源。
2、请求消息头:*****
http请求报文从第二行开始,到空行为止,都叫消息头。
一般来说,在头信息里,服务器要对请求者进行身份验证。
Accept:浏览器可接受的MIME类型。
MIME:这个最早是电子邮件携带媒体文件时产生的概念。
Accept-charset:浏览器通过这个告诉服务器,自己支持那种字符集。
Accept-encoding:这个是编码方式,gzip等
Accept-language:浏览器希望使用的语言。
Host:初始url中主机的ip和端口号。
Connection:表示是否是一个持久连接,如果是keep-alive,就是一个持久连接。
Cookie:保存一些不敏感的信息。
Date:请求的GMT
请求正文:请求方式是post的时候才能看见正文,正文内容如下:
Pageindex=1&productid=1011&uid=u001
1、响应消息行
HTTP/1.1 200 OK
协议/版本 响应状态码 对响应状态码的描述
200正常
404找不到资源
500服务器内部错误
302/307是临时重定向……
2、响应消息头
包含我们刚才请求的消息头的大部分内容
只不过Accept开头改为Content开头
***Content-length:响应消息的长度。
3、响应消息正文
和右键网页“查看源代码”看到的内容一样。