线程安全(锁)

news/2024/6/29 12:07:43 标签: Java基础, , 线程安全

撰写时间:2019年0604

 

Mysql的引擎

mysql-5.5.5开始,InnoDB 作为默认存储引擎,以前是MyISAM引擎

MyISAM引擎和InnoDB引擎的比较:

MyISAM 是非事务安全型的,而 InnoDB 是事务安全型的。

MyISAM 的粒度是表级,而 InnoDB 支持行级定。

MyISAM 支持全文类型索引,而 InnoDB 不支持全文索引。

MyISAM 相对简单,所以在效率上要优于 InnoDB,小型应用可以考虑使用 MyISAM。

MyISAM 表是保存成文件的形式,在跨平台的数据转移中使用 MyISAM 存储会省去    不少的麻烦。

InnoDB 表比 MyISAM 表更安全,可以在保证数据不会丢失的情况下,切换非事务    表到事务表(alter table tablename type=innodb)。

default-storage-engine=InnoDB

default-storage-engine=MYISAM

事务(回滚):当事务正常提交上去的时候,下一个事务失败的时候

事务要回滚到上一条数据。旧引擎MyISAM 就是不支持回滚,所以不支持事务

悲观:即很悲观 ,每次拿数据的时候都觉得数据会被人更改,所以拿数据的时

候就把这条记录掉,这样别人就没办法改这条数据了,一直到你的释放。

 * 悲观的实现采用的是数据库内部的机制 for update

 * 在查询数据的时候先用for update把这条数据住,然后更改完这条数据再

提交。这样别的线程没法更新这条数据,也就保证了不会丢失更新

行级

一条数据 改其他数据没影响的

需要数据库支持

旧的那个引擎是不支持行级

public class DemoLock1 {

public static void main(String[] args) {

Connection conn = null;

PreparedStatement ps = null;

ResultSet rs = null;

try {

conn = DBUtil.getConnection();

conn.setAutoCommit(false);

String sql = "Select * From user where id=5 for update";

ps = conn.prepareStatement(sql);

// 执行返回结果

rs = ps.executeQuery();

while (rs.next()) {

System.out.println("id:" + rs.getInt(1)

+ " name:"+ rs.getString(2)

+ " passwpord:" + rs.getString(3));

sql = "UPDATE USER SET  NAME ='cbd' WHERE id =5";

ps = conn.prepareStatement(sql);

ps.executeUpdate();

}

conn.commit();

} catch (SQLException e) {

e.printStackTrace();

} finally {

DBUtil.close(conn, ps, rs);

}

}

}

 

悲观在 高并发的时候会出现严重问题

悲观给人的感觉就是 一直在等待 然后给人返回一个超时

不如直接给出一个操作不成功

这就是出现了乐观

 

*查询数据的时候总觉得不会有人更改数据,等到更新的时候在判断这个数据有没

有被人更改,有人更改了则本次更新失败

*通过在表里面加一个版本号的形式

 

乐观是通过代码逻辑来实现的 而不是通过数据库内部的机制

当操作某条数据的时候 先查询出来获取某个值,然后已该值为修改的where 条件,

当这条数据先被修改过,那么那个值就发生改变,然后修改的where条件获取的是

进来时查询到的值,是修改前的,然后跟当前最新值不对应,然后就返回一个修改

不成功。

public class DemoLock2 {

public static void main(String[] args) {

Connection conn=null;

PreparedStatement ps=null;

ResultSet rs=null;

int r=0;

try {

conn=DBUtil.getConnection();

conn.setAutoCommit(false);

String sql="Select * From user where id=5";

ps=conn.prepareStatement(sql);

rs=ps.executeQuery();

while (rs.next()) {

int version=rs.getInt("version");

sql="update user set name='蔡一0',version=version+1

where id=5 and version=?";

ps=conn.prepareStatement(sql);

ps.setInt(1, version);

r=ps.executeUpdate();

}

conn.commit();

if (r>0) {

System.out.println("修改成功");

}

} catch (SQLException e) {

e.printStackTrace();

}

finally{

DBUtil.close(conn, ps, rs);

}

}

}

测试看效果:断点执行,在提交之前一定要断点,在断点那停的时候去数据库手动修改

的那条数据,看看实际效果是不是跟说的一样。


http://www.niftyadmin.cn/n/1729828.html

相关文章

JDBC封装调用

撰写时间:2019年06月05日 把需要反复写的代码封装起来,能增加打代码效率,连接数据库查询数据的时候那几段 关键的代码就是每次都需要写,老是重复写挺放烦的哦,所有要学会合适的偷懒,封装 起来&#xff0…

Java实现验证登录

撰写时间:2019年06月17 首先一个登录页面: Js引用: 提交: function login(){ var layerIndexlayer.load();$("#formLogin").ajaxSubmit(function(data){if((typeof data)"string"){dataJSON.parse(data);…

Servlet后台获取取表单数据

撰写时间&#xff1a;2019年06月28日 Servlet获取页面提交过来的表单数据有多种&#xff0c;根据需要与提交的数据量选择 方法一: 以登录为例&#xff0c;提交的数据量不多&#xff0c;也没什么特殊的数据 页面代码&#xff1a; <form id"formLogin" class"…

localStorage、sessionStorage和cookies之间的区别

撰写时间&#xff1a;2019年06月28日 localStorage&#xff1a;localStorage 和 sessionStorage 属性允许在浏览器中存储 key/value 对的数据。localStorage 用于长久保存整个网站的数据&#xff0c;保存的数据没有过期时间&#xff0c;直到手动去删除。localStorage 属性是只…

正则表达式验证手机号码+定义格式

撰写时间&#xff1a;2019年07月06日 用正则表达式限制数据的输入&#xff0c;用以减少错误数据的输入&#xff0c;或者减少因为输入数据类型的不对应导致后期代码的出错。 例子&#xff1a;验证手机号码 每个运营商都发行了各自的手机号段&#xff0c;目前中国移动现在拥有23个…

Java实现带图片新增个人信息

撰写时间&#xff1a;2019年07月06日 HTML代码&#xff1a; <form id"fmPersonalDetails" action"${ctx}/servlet/myAccountServlet?funinsertPersonaldata" method"post" enctype"multipart/form-data" autocomplete"off&…

正则表达式使用

撰写时间&#xff1a;2019年07月16日 正则表达式菜鸟教程&#xff1a; https://www.runoob.com/regexp/regexp-syntax.html 表达式全集&#xff1a; http://tool.oschina.net/uploads/apidocs/jquery/regexp.html 常用到的事件&#xff1a; onblur&#xff1a;失去焦点触发、…

NextJS设置Tailwind CSS

运行以下命令安装 Tailwind CSS 及其依赖项&#xff1a; npm install tailwindcss postcss autoprefixer npm install postcss-flexbugs-fixes postcss-preset-env postcss-normalize fullhuman/postcss-purgecss 第 3 步&#xff1a;配置 Tailwind CSS 安装 Tailwind CSS 后…