«Это 28-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г."
предисловие
Сегодня я представлю вам более практическую функцию.JavaгенерироватьСерийный номер/номер заказа, чтобы перечислить еще несколько распространенных случаев в нашей жизни:
- номер заказа
- Номер продукта
- номер транзакции
- номер отслеживания
хранилище данныхя используюmysql, позвольте мне поделиться с вами, как этого добиться ~
теоретические знания
Что такое транзакция?
база данныхдела(Сокращение: транзакция) — логическая единица в процессе выполнения системы управления базами данных, которая состоит из ограниченной последовательности операций с базой данных.
Грязные чтения, неповторяемые чтения, фантомные чтения
1,грязное чтение: транзакция A изменяет данные, но еще не отправила их в базу данных. В это время, когда транзакция B обращается к данным, транзакция B не обновляет данные. Это явление называется грязным чтением.
2,неповторяемое чтение: транзакция A считывает часть данных несколько раз. В это время транзакция B изменяет данные в середине, что приводит к несогласованным результатам, считанным несколько раз транзакцией A.
3.галлюцинации: когда транзакция A дважды запрашивает один и тот же диапазон до и после, последний запрос увидит строки, которые не были видны предыдущему запросу, потому что транзакция B добавляет новую часть данных перед последним запросом.
Четыре уровня изоляции mysql
По уровню изоляции от низкого к высокому,Чем выше изоляция, тем хуже эффективность,неповторяемое чтение, это MySQLУровень изоляции по умолчанию.
| Уровень изоляции транзакции | грязное чтение | неповторяемое чтение | галлюцинации |
|---|---|---|---|
| незафиксированное чтение | да | да | да |
| неповторяемое чтение (чтение-фиксация) | нет | да | да |
| повторяемое чтение | нет | нет | да |
| сериализуемый | нет | нет | нет |
1,читать незафиксированные: Разрешить другим транзакциям читать данные до того, как эта транзакция будет зафиксирована. Недостатки: могут возникать грязные чтения, фантомные чтения и неповторяющиеся чтения.
2,неповторяемое чтение: Проблемы будут возникать при параллельных условиях, например: пользователь А читает данные, а затем пользователь Б читает данные и изменяет их.В это время, когда пользователь А снова читает данные, обнаруживается, что два значения до и после несовместимы Недостатки: Это может привести к фантомным чтениям и неповторяющимся чтениям.
3.повторяемое чтение: при использовании уровня изоляции Repeatable Read все строки, на которые каким-либо образом ссылается транзакция, блокируются во время выполнения транзакции. Минусы: Фантомное чтение
4.сериализовать: не будет использовать механизм mysql mvcc, получать блокировку чтения при каждом запросе на выборку и пытаться получить блокировку записи при каждой операции обновления. Недостаток: худшая эффективность
Два пессимистичных замка
Общий замок (блокировка S): если транзакция T добавляет общую блокировку к данным A, другие транзакции могут добавлять только общие блокировки к A, но не эксклюзивные блокировки. Транзакции, которым предоставлена общая блокировка, могут только читать данные и не могут изменять данные.
Эксклюзивный замок (X замок): если транзакция T добавляет монопольную блокировку к данным A, другие транзакции не могут добавлять блокировку любого типа к A. Транзакции, которым предоставлены эксклюзивные блокировки, могут как читать, так и изменять данные.
Реализация кода Java
private String createNewBidNumber() {
//格式说明 CODE20201111xxx CODE+当前年月日+编号(具体长度看需求)
String front="CODE";//前缀
//当前时间编码
Date date = new Date();
String bidDate = new SimpleDateFormat("yyyyMMdd").format(date);
Object bidService=null;//修改为自己的业务代码
if (bidService != null){// 在数据表中查到了,说明现在这个订单不是今天的第一单
String bid = bidService.getXXXX(); //取出ID,也就是业务号
bid = bid.substring(10,13); // 取出后三位数,也就是自动生成的三位数 001
int num = Integer.valueOf(bid);
num ++; // 加1
if(num<10){
String bidNum = String.format("%03d", num);//%03d 只是三位,不足补0
String code = front+bidDate+bidNum;
return code;
}
else if(num<100){
String bidNum = String.format("%03d", num);//num<100,说明是两位数,前面要补一个0
String code = front+bidDate+bidNum;
return code;
}
else {
String bidNum = String.valueOf(num);
String code =front+bidDate+bidNum;
return code;
}
}else {
int number = 1;
String bidNum = "00" + number;
String code = front+bidDate+bidNum;
return code;
}
}
Спасибо
- Грязное чтение, неповторяемое чтение, фантомное чтение базы данных mysql
- Разберитесь с четырьмя уровнями изоляции транзакций MySQL за десять минут
- Уровень транзакции, разница между неповторяемыми чтениями и фантомными чтениями
- Грязные чтения, неповторяемые чтения, общие блокировки, пессимистические блокировки и Пять уровней изоляции транзакций
- Понимание MySQL Repeatable Read
- mysql-serializable-serialization сценарий уровня изоляции сериализации экземпляра