Java事务,深入java事务的原理与引用+javaweb的tomcat和servlet认识

什么是事务?

事务:事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部完成,要么全部不完成

事务的特点:

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
http响应报文
1、响应消息行
HTTP/1.1     200     OK
协议/版本   响应状态码    对响应状态码的描述
200正常
404找不到资源
500服务器内部错误
302/307是临时重定向……
2、响应消息头
包含我们刚才请求的消息头的大部分内容
只不过Accept开头改为Content开头
***Content-length:响应消息的长度。
3、响应消息正文
和右键网页“查看源代码”看到的内容一样。
什么是Servlet?
Server Applet 服务器小程序JavaServlet的简称,用Java语言编写的服务器,可以产生动态web内容。
Servlet是一个接口,我们使用它,要实现这个接口

猜你喜欢

转载自blog.csdn.net/qq_41813207/article/details/80240461